2013-01-04 19 views
4

我有一個問題,試圖解碼和打印從套接字連接接收的JSON。Python的JSON解碼ValueError:額外的數據:

完整回溯:

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

您需要顯示演示此問題的示例數據。 – BrenBarn

+0

你絕對需要使用原始套接字嗎? – miku

+0

@BrenBarn https://github.com/alecgorge/jsonapi/wiki/How-to-use-the-stream-api-over-a-socket-connection(頁面底部) – Jeremy

回答

8

無論你收到什麼,它似乎並沒有結束它應該結束的地方;例如:

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

.....

2

在JSON LIB - > decoder.py->解碼功能

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

它的意思是,如果你的字符串的len!= end,會引發這個異常 最後是你的字符串中的最後一個「}」位置。 所以你我可以使用:

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

切斷多餘的數據最後的「}」之後。

0

有時可能會有';'在JSON字符串的尾部。只需將其刪除:

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