在将字符串用作json对象之前,转义字符串的正确方法是什么

问题描述:

我必须从数据库值创建JSON字符串并将其再次推回到数据库。我的Python代码是:在将字符串用作json对象之前,转义字符串的正确方法是什么

json = "{" 
for row in cursor_mysql: 
    #mainkey = row[0] 
    #name = row[1] 
    #value = row[2] 
    mainkey = """" " \n \/""" #for testing only 
    name = """ {} " \r \t """ #for testing only 
    value = """ ' " \ &  """ #for testing only 
    json += """"%s":{"name":"%s","value":"%s"},""" % (re.escape(mainkey), re.escape(name), re.escape(value)) 

json = json[:-1] 
json += "}" 
#print json 
query = """UPDATE table SET json = '%s' WHERE id = '%d' RETURNING id""" % (json, rowId) 
cursor_postgres.execute(query) 
conn_postgres.commit() 
insertId = cursor_postgres.fetchone()[0] 

这段代码在没有恶意字符时效果很好。但是,如上面的测试用例中所示,它在撒上非字母数字值时不起作用。

坏JSON它使我的分贝是:

{ 
    """ 
\/ ": { 
     "name": " {} "","value":"'" " 
    }, 
    """ 
\/ ": { 
     "name": " {} "","value":"'" " 
    } 
} 

如何消毒字符串,使反序列化时,JSON输出与输入相同?

+0

你为什么不使用[内置JSON编码器](http://docs.python.org/library/json.html)? – Tomalak

import json 

data = json.dumps(BIG_STRUCTURE_GOES_HERE) 
query = """UPDATE table SET json = %s WHERE id = %s RETURNING id""" 
cursor_postgres.execute(query, (data, rowId)) 
conn_postgres.commit() 
+2

谢谢@Ignacio Vazquez-Abrams您所做的一个重要更正是在查询中将%d更改为%s。我在%d处得到'ValueError:不支持的格式字符'd'(0x64)在索引32'处 – jerrymouse

只需使用json库:

import json 
mainkey = """" " \n \/""" #for testing only 
name = """ {} " \r \t """ #for testing only 
value = """ ' " \ &  """ #for testing only 
d = {mainkey: {"name": name, "value": value}} 
jsonValue = json.dumps(d)