Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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时出现ValueError_Python_Regex_Json - Fatal编程技术网

Python 解码json时出现ValueError

Python 解码json时出现ValueError,python,regex,json,Python,Regex,Json,运行它,我得到这个错误 import json import urllib import re import binascii def asciirepl(match): s = match.group() return binascii.unhexlify(s[2:]) query = 'google' p = urllib.urlopen('http://www.google.com/dictionary/json?callback=a&q='+query+'&

运行它,我得到这个错误

import json
import urllib
import re
import binascii 

def asciirepl(match):
  s = match.group()  
  return binascii.unhexlify(s[2:])  

query = 'google'
p = urllib.urlopen('http://www.google.com/dictionary/json?callback=a&q='+query+'&sl=en&tl=en&restrict=pr,de&client=te')
page = p.read()[2:-10] #As its returned as a function call

#To replace hex characters with ascii characters
p = re.compile(r'\\x(\w{2})')
ascii_string = p.sub(asciirepl, page)

#Now decoding cleaned json response
data = json.loads(ascii_string)
shadyabhi@archlinux/tmp$python2 define.py
回溯(最近一次呼叫最后一次):
文件“define.py”,第19行,在
data=json.load(ascii_字符串)
文件“/usr/lib/python2.7/json/_init__.py”,第326行,加载
返回\u默认\u解码器。解码
文件“/usr/lib/python2.7/json/decoder.py”,第366行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
原始解码中的文件“/usr/lib/python2.7/json/decoder.py”,第382行
obj,end=self.scan_一次(s,idx)
ValueError:应为,分隔符:第1行第403列(字符403)

据我所知,json是没有任何错误的,因为我从谷歌的服务器收到它。我所做的只是删除十六进制字符。非常感谢您的帮助。

字符403是“文本”中的第一个嵌入引号-这是无效的json:

shadyabhi@archlinux /tmp $ python2 define.py                                                                                                                                      
Traceback (most recent call last):
  File "define.py", line 19, in <module>
    data = json.loads(ascii_string)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 403 (char 403)
最好的方法是先对json进行解码,然后根据需要对每个字符串进行解构


编辑:如果这真的是无效的JSON,就像Karl Knechtel在评论中说的那样,谷歌应该被告知他们的API是错误的。如果Python的实现是基于有效的JSON的,那么应该告诉他们修复它。无论您采取何种解决方法,如果这一问题得到解决,应该很容易删除。

解码\x转义可能会产生“标记”,当它们出现在JSON数据中编码的“字符串”中时,需要重新转义

{
    "type":"url",
    "text":"\\x3ca href\\x3d\\x22http://www.people-communicating.com/jargon-words.html\\x22\\x3ehttp://www.people-communicating.com/jargon-words.html\\x3c/a\\x3e",
    "language":"en"
}
这仍然无法处理控制字符;因此您可能希望将\x转义转换为\u转义,这些转义在JSON标准中描述,并由
JSON
模块解析。这样做的另一个好处是更简单:)


第1行第403列(及其周围)是什么?@TimPietzcker没有等待响应,而是从代码所暗示的URL下载了json文件,并亲自检查了它。我怀疑Izkata也做了类似的事情。事实上,我复制了shadyabhi的代码并自己运行了它。不幸的是,这无法按描述工作;
json。加载
会阻塞
\x#
样式,因为json标准没有提到
\x
序列。但是,首先将
\x###
序列转换为
\u00###
序列应该可以让它工作。我无法想象有任何方法可以读取www.json.org上的信息,从而使其成为有效的json。他们可能没有注意到,因为Javascript本身就是这样做的使用这种转义。许多现实世界中的JSON解析器似乎有点松散,尽管还没有到HTML解析器的程度;)谷歌人可能不应该首先使用\x样式的转义。
{
    "type":"url",
    "text":"\\x3ca href\\x3d\\x22http://www.people-communicating.com/jargon-words.html\\x22\\x3ehttp://www.people-communicating.com/jargon-words.html\\x3c/a\\x3e",
    "language":"en"
}
def asciirepl(match):
  chr = binascii.unhexlify(match.group()[2:])
  return '\\' + chr if chr in ('\\"') else chr
def asciirepl(match):
  return '\\u00' + match.group()[2:]