gpt4 book ai didi

python - json.loads() 给出异常,它期望一个值,看起来值在那里

转载 作者:太空狗 更新时间:2023-10-30 03:00:11 24 4
gpt4 key购买 nike

代码:

loaded_json = json.loads(json_set)

json_set是从 JSON 格式数据的网页中收集的字符串。完整的字符串(警告:长)在这里:http://pastebin.com/wykwNEeg

它给我的错误(如果我将字符串保存到它自己的文件中并且 readlines + json.loads 在 IDLE 中的那一行)是:

    Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 62233 (char 62232)

","distance":\u002d1,"lo
^(gedit tells me column 62233 lies between the colon and the \

我猜它与 unicode 有关,这个特殊的是 - 的 unicode , 因此该值应为 "distance":-1

奇怪的是,如果我在遇到异常(或者我猜是在任何地方)时打印出该行,它就会像上面那样出现。但是,如果我打开一个 python3 IDLE session 并执行此操作,我会得到不同的结果:

>>> mystr = '"distance":\u002d1'
>>> mystr
'"distance":-1'
>>> print(mystr)
"distance":-1
>>>

如何让这个 JSON 正确加载?

===============

此数据较早来自看起来像这样的代码(基本上表明该字符串是 response.decode('utf8') 的结果):

'''This bit gets the page from the website, it's called from the below code block'''
def load_arbitrary_page(self, url):
response = self.opener.open(url)
response_list = response.readlines()
decode_list = []
for line in response_list:
decode = line.decode('utf8')
decode_list.append(decode)

print(BeautifulSoup(''.join(decode_list)).find("title"))

return decode_list

    html = grabber.load_arbitrary_page(url)
count+=1
for line in html:
#Appears to show up 3 times, all in the same line
if "<my search parameter>" in line:
content_list.append(line)
break

最后,content_list在注释 ( re.split("<!-- ... ) 上拆分,最后一部分成为变量 json_set .

最佳答案

如果您查看 ECMA-404 standard for JSON , 你会看到数字可能有一个可选的前导减号,它们指定为 U+002D这是 ASCII 减号。但是,\u002D 不是减号。它是减号的字符转义,但字符转义仅在字符串值的上下文中有效。但是字符串值必须以双引号开头和结尾,所以这不是字符串值。因此,您拥有的数据不会解析为有效的 JSON 值,而 Python JSON 解析器拒绝它是正确的。

如果您尝试使用 http://jsonlint.com/ 验证该数据 blob网站,它还会报告数据不是有效的 JSON。

Parse error on line 2172:
... "distance": \u002d1,
-----------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

您给出的 IDLE 工作示例不是相等比较,因为您给出的字符串不同:

'"distance":\u002d1' != '"distance":\\u002d1'

左边的字符串是您给 IDLE 的字符串,如果您将它括在花括号中,它将是有效的 JSON:

>>> json.loads('{"distance":\u002d1}')
{'distance': -1}

但是如果你给它右边的字符串,你会发现它不会像你期望的那样工作:

>>> json.loads('{"distance":\\u002d1}')
Traceback (most recent call last):
File "/usr/lib/python3.2/json/decoder.py", line 367, in raw_decode
obj, end = self.scan_once(s, idx)
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.2/json/__init__.py", line 309, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.2/json/decoder.py", line 351, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.2/json/decoder.py", line 369, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

关于python - json.loads() 给出异常,它期望一个值,看起来值在那里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30270668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com