Python JSON decode ValueError: Additional data:

I'm having a problem trying to decode and print the JSON that I get from the socket connection.

Full trace:

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) 

As you can see, the first two lines print well, and then crash.

Full code:

 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() 

I was looking for this error, and the pages I found did not help solve my problem, any help would be appreciated.

+4
source share
3 answers

Whatever you receive, it does not seem to end where it should end; Example:

 >>> import json >>> json.loads(""" {"Hello" : "World"} \ """) .... ValueError: Extra data: line 1 column 21 - line 1 column 23 (char 21 - 23) 

I would suggest checking your result before it figured out to deal with the problem.

PS. There are simpler ways to get JSON data from the server (assuming your server returns collapsible JSON, which it cannot). The following is an example of using the requests library:

 >>> 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/... 

.....

+8
source

In json lib function -> decoder.py-> decode

 if end != len(s): raise ValueError(errmsg("Extra data" , s , end , len(s))) 

This means that if your line is len! = End, it will raise this exception. And the end is the last "}" position in your line. so you can use:

 string = "".join([string.rsplit("}" , 1)[0] , "}"]) 

cut extra data after the last "}".

+2
source

Sometimes it can be ';' at the tail of the JSON string. Just delete it:

 json.loads(string.strip(';')) 
0
source

All Articles