在将字符串用作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输出与输入相同?
答
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
答
http://docs.python.org/library/json.html
http://pypi.python.org/pypi/simplejson/
django.utils.simplejson
答
只需使用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)
你为什么不使用[内置JSON编码器](http://docs.python.org/library/json.html)? – Tomalak