带有转义字符的json.loads

时间:2013-08-14 13:27:51

标签: python json string dictionary unicode-escapes

我正在尝试将此字符串转换为python dict:

q = '{"request_body": "{\\x22username\\x22:\\x222\\x22,\\x22password\\x22:\\x226\\x22,\\x22id\\x22:\\x22e2cad174-736e-3041-cf7e\\x22, \\x22FName\\x22:\\x22HS\\x22}", "request_method": "POST"}'

当我执行json.loads(a)时,它会给我一个错误simplejson.decoder.JSONDecodeError: Invalid \escape: line 1 column 19 (char 19)。所以我决定将\x22转换为"。我遵循了this问题的建议。

>>> q.decode('string_escape')
'{"request_body": "{"username":"2","password":"6","id":"e2cad174-736e-3041-cf7e", "FName":"HS"}", "request_method": "POST"}'
>>> 

但在那之后"{"部分无效。 所以我的问题是将字符串q转换为python dict的可能方法是什么?

1 个答案:

答案 0 :(得分:9)

问题是JSON不支持\xNN转义,只支持\uNNNN。将\x22替换为"会使JSON无效。您应该做的是将\xNN替换为\u00NN

>>> q = q.replace('\\x', '\\u00')
>>> json.loads(q)
{'request_body': '{"username":"2","password":"6","id":"e2cad174-736e-3041-cf7e", "FName":"HS"}', 'request_method': 'POST'}

(注意:这不是一个完整的解决方案,因为它会错误地将正确转义的字符串替换为abc\\xyzabc\\u00yz。完整的解决方案可能需要正则表达式甚至是词法分析器。)