Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用python解析简单的json_Python_Json_Simplejson - Fatal编程技术网

无法使用python解析简单的json

无法使用python解析简单的json,python,json,simplejson,Python,Json,Simplejson,我有一个非常简单的json,不能用simplejson模块解析。 复制: import simplejson as json json.loads(r'{"translatedatt1":"Vari\351es"}') 结果: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/pymodules/python2.5/simplejson/__

我有一个非常简单的json,不能用simplejson模块解析。 复制:

import simplejson as json
json.loads(r'{"translatedatt1":"Vari\351es"}')
结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.5/simplejson/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 335, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 351, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid \escape: line 1 column 23 (char 23)
有人知道哪里出了问题,以及如何正确解析上面的json吗

在那里编码的字符串是:Variées

另外,我使用python 2.5


非常感谢

您可能不打算使用原始字符串,而是使用unicode字符串

>>> import simplejson as json
>>> json.loads(u'{"translatedatt1":"Vari\351es"}')
{u'translatedatt1': u'Vari\xe9es'}
如果要引用JSON字符串中的数据,需要使用\unnn:

请注意,在这种情况下,生成的dict略有不同。解析unicode字符串时,simplejson使用unicode字符串作为键。否则,它使用字节字符串键


如果您的JSON数据实际上使用了\351e,那么它只是被破坏了,没有有效的JSON。

这是非常正确的;Vari\351es包含无效转义,JSON标准不允许后跟数字的\

无论产生什么样的代码都应该被修复。如果这是不可能的,您需要使用正则表达式来删除这些转义,或者用有效的转义替换它们

如果我们将351数字解释为一个八进制数字,那么它将指向unicode代码点U+00E9,即带有锐音符的字符拉丁小写字母E。您可以使用以下方法“修复”JSON输入:

import re

invalid_escape = re.compile(r'\\[0-7]{1,6}')  # up to 6 digits for codepoints up to FFFF

def replace_with_codepoint(match):
    return unichr(int(match.group(0)[1:], 8))


def repair(brokenjson):
    return invalid_escape.sub(replace_with_codepoint, brokenjson)
使用“修复”,可以加载您的示例:

>>> json.loads(repair(r'{"translatedatt1":"Vari\351es"}'))
{u'translatedatt1': u'Vari\xe9es'}

您可能需要调整代码点的解释;我选择octal是因为Variées是一个实际的单词,但您需要用其他代码点对此进行更多的测试。

如果字符串位于某个变量中,例如:s=r'{translatedatt1:Vari\351es}',我可以这样做吗?谢谢只是不要那样创建字符串。如果要创建包含unicode数据的字符串,请去掉r前缀,改用u。如果您真的想在JSON数据中使用引号,您需要使用\u351e。@bikeshedder:我认为OP意味着服务器发送了该数据。r使我们更容易显示发送的原始数据。是的,这是损坏的JSON数据…U+351E是CJK表意文字扩展A。。也不确定这是正确的解释。我认为您与octal的关系更密切。此代码是为/由Venda平台生成的。不幸的是,我无法改变这种行为。顺便说一句,什么才是有效的逃逸者?谢谢,但结果并不是预期的:在rapair函数之后,我们得到了Varişes,而它应该是Varişes@diemacht:已更新:-由于您没有指定您期望的内容,我不得不猜测,然后更新了我的猜测。
>>> json.loads(repair(r'{"translatedatt1":"Vari\351es"}'))
{u'translatedatt1': u'Vari\xe9es'}