我在尝试解码和打印从套接字连接收到的JSON时遇到问题。
完整的追溯:
C:\Users\Jeremy>python F:\Files\Python\test.py
2013-01-04 21:15:35 [INFO] [AutoSaveWorld] World save Complete!
2013-01-04 21:15:50 [INFO] [←[34;1mMain←[37;1m]←[32;22mRexOZ←[37;1m: you cahaned
your house it looks awesome←[m
Traceback (most recent call last):
File "F:\Files\Its safer indoors\Python\test.py", line 14, in <module>
data = json.loads(dreceve)
File "C:\Python33\lib\json\__init__.py", line 309, in loads
return _default_decoder.decode(s)
File "C:\Python33\lib\json\decoder.py", line 355, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 2 column 1 - line 3 column 1 (char 151 - 344)
正如您所看到的那样,前两行打印正常,然后崩溃。
完整代码:
import socket
import json
import re
HOST = 'host.host.net'
PORT = 8082
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
dsend = "/api/subscribe?source=console&key=SUPERSEXYSECRETEY&show_previous=true\n"
s.sendall(dsend.encode())
while 1:
dreceve = s.recv(1024).decode()
data = json.loads(dreceve)
succses = data['success']
line = succses['line']
print(line)
s.close()
我已经为这个错误而烦恼了,我找到的页面并没有解决我的问题,任何帮助工作都会受到赞赏。
答案 0 :(得分:9)
无论你收到什么,它似乎都没有结束它应该结束的地方;例如:
>>> import json
>>> json.loads(""" {"Hello" : "World"} \ """)
....
ValueError: Extra data: line 1 column 21 - line 1 column 23 (char 21 - 23)
我建议在解析输出之前检查输出以解决问题。
PS。有更简单的方法从服务器获取JSON数据(假设您的服务器返回可解析的JSON,它可能不会)。以下是使用requests库的示例:
>>> import json, requests
>>> u = "http://gdata.youtube.com/feeds/api/standardfeeds/most_popular?alt=json"
>>> json.loads(requests.get(u).text) # <-- request + parse
{u'feed': {u'category': [{u'term': u'http://gdata.youtube.com/...
.....
答案 1 :(得分:3)
在json lib - &gt; decoder.py-&gt;解码函数
中if end != len(s):
raise ValueError(errmsg("Extra data" , s , end , len(s)))
这意味着如果你的字符串的len!= end,会引发这个异常 最后是你的字符串中的最后一个“}”位置。 所以我可以使用:
string = "".join([string.rsplit("}" , 1)[0] , "}"])
在最后一个“}”之后删除额外的数据。
答案 2 :(得分:0)
有时可能有';'在JSON字符串的尾部。只需删除它:
json.loads(string.strip(';'))