3

ログインが必要な URL から json を解析しようとしています。エラーの場所がわからないため、すべてのコードをここに含めます。

try: import simplejson as json
except ImportError: import json
import urllib2

username = 'user'
password = '1234'
url = "https://www.blah.com/someplace"

# set up the username/password/url request
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, "https://www.blah.com", username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
request = urllib2.Request(url)
response = opener.open(request)

# option 1
json_object = json.loads(str(response))

#option 2
json_object = json.loads(response)

オプション 1 (オプション 2 をコメントアウト) でコードを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "jsontest.py", line 22, in <module>
    json_object = json.loads(str(request))
  File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 420, in raw_decode
    raise JSONDecodeError("No JSON object could be decoded", s, idx)
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)

オプション 2 を実行した場合:

Traceback (most recent call last):
  File "jsontest.py", line 23, in <module>
    json_object = json.loads(request)
  File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

私のサンプル JSON は、私が知る限り有効です。

{"set1":[{"data1":"411","data2":"2033","data3":"1","data4":"43968077","data5":"217","data6" :"106828","data7":[]}], "set2":{"data8":"411","data9":"2033","data10":"43968077","data11":"217223360" ,"data12":"106828"}}

simplejson バージョン = 2.3.2、Python 2.7.3

これはすべて非常に新しいため、ポインタは非常に役立ちます。

4

2 に答える 2

8

要求ではなく、応答をデコードする必要があります。

json_object = json.load(response)

応答はファイルのようなオブジェクトであるため.load()、jsonライブラリに直接読み取らせるために使用できます。

または(一時的なメモリ使用を犠牲にして)、.loads()完全に読み取られた応答で関数を使用します。

json_object = json.loads(response.read())

python 2.7にはすでにsimplejsonライブラリが含まれており、名前が次のように変更されていることに注意してくださいjson

import json
于 2012-09-07T22:54:28.223 に答える
1

リクエストではなくレスポンスを使用する必要があります(おそらくタイプミス?)が、さらにresponse.read()HTTPレスポンスの本文を取得するために使用する必要があります。

json_object = json.loads(response.read())
于 2012-09-07T22:57:00.147 に答える