Chr*_*ris 18 python json escaping
我有一个应用程序将一个JSON对象(使用Prototype格式化)发送到ASP服务器.在服务器上,Python 2.6"json"模块尝试加载()JSON,但它在一些反斜杠组合上窒息.注意:
>>> s
'{"FileExists": true, "Version": "4.3.2.1", "Path": "\\\\host\\dir\\file.exe"}'
>>> tmp = json.loads(s)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
{... blah blah blah...}
File "C:\Python26\lib\json\decoder.py", line 155, in JSONString
return scanstring(match.string, match.end(), encoding, strict)
ValueError: Invalid \escape: line 1 column 58 (char 58)
>>> s[55:60]
u'ost\\d'
Run Code Online (Sandbox Code Playgroud)
因此第58列是转义反斜杠.我以为这个WAS正好逃脱了!UNC是\\host\dir\file.exe,所以我只是加倍斜杠.但显然这并不好.有人可以帮忙吗?作为最后的手段,我正在考虑将\转换为/然后再转回,但这对我来说似乎是一个真正的黑客.
提前致谢!
jfs*_*jfs 24
正确的json是:
r'{"FileExists": true, "Version": "4.3.2.1", "Path": "\\\\host\\dir\\file.exe"}'
Run Code Online (Sandbox Code Playgroud)
r如果省略它,请注意该字母,您也需要\为Python 转义.
>>> import json
>>> d = json.loads(s)
>>> d.keys()
[u'FileExists', u'Path', u'Version']
>>> d.values()
[True, u'\\\\host\\dir\\file.exe', u'4.3.2.1']
Run Code Online (Sandbox Code Playgroud)
注意区别:
>>> repr(d[u'Path'])
"u'\\\\\\\\host\\\\dir\\\\file.exe'"
>>> str(d[u'Path'])
'\\\\host\\dir\\file.exe'
>>> print d[u'Path']
\\host\dir\file.exe
Run Code Online (Sandbox Code Playgroud)
Python REPL默认打印repr(obj)一个对象obj:
>>> class A:
... __str__ = lambda self: "str"
... __repr__ = lambda self: "repr"
...
>>> A()
repr
>>> print A()
str
Run Code Online (Sandbox Code Playgroud)
因此,s对于JSON,您的原始字符串未正确转义.它包含未转义'\d'和'\f'.print s必须显示'\\d'否则JSON不正确.
注意:JSON字符串是零个或多个Unicode字符的集合,用双引号括起来,使用反斜杠转义(json.org).在上面的例子中,我跳过了编码问题(即从字节串到unicode的转换,反之亦然).
由于异常为您提供了令人讨厌的转义字符的索引,因此我开发的这个小技巧可能是不错的:)
def fix_JSON(json_message=None):
result = None
try:
result = json.loads(json_message)
except Exception as e:
# Find the offending character index:
idx_to_replace = int(e.message.split(' ')[-1].replace(')',''))
# Remove the offending character:
json_message = list(json_message)
json_message[idx_to_replace] = ' '
new_message = ''.join(json_message)
return fix_JSON(json_message=new_message)
return result
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28646 次 |
| 最近记录: |