5

ソケット接続から受け取った 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)

ご覧のとおり、最初の 2 行は正常に印刷され、その後クラッシュします。

完全なコード:

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

私はこのエラーを探し回りましたが、見つけたページは私の問題を解決しませんでした。

4

3 に答える 3

9

あなたが受け取るものは何でも、それはそれが終わるべき場所で終わらないようです。例:

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

問題を把握するために、出力を解析する前に出力を検査することをお勧めします。

PS。サーバーからJSONデータを取得する簡単な方法があります(サーバーが解析可能なJSONを返すと仮定しますが、そうでない場合もあります)。リクエストライブラリを使用した例を次に示します。

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

....。

于 2013-01-04T04:00:19.050 に答える