4

正しく機能しているjson応答:

obj = urllib.urlopen("http://www.omdbapi.com/?t=Fight Club")
response_str = obj.read()
response_json = simplejson.loads(response_str)

上記のコードは、次のようなjsonリクエストを作成します:

{
    "Title":"Fight Club",
    "Year":"1999",
    "Rated":"R",
    "Released":"15 Oct 1999",
     ......
    "Response":"True"
}

これで寝れます…でも

正しく機能していない json 応答:

obj = urllib.urlopen("https://api.stackexchange.com/2.1/answers?order=desc&sort=activity&site=stackoverflow")
response_str = obj.read()
response_json = simplejson.loads(response_str)

上記のコードは、次のようなjsonリクエストを作成します:

{

    "items": [
        {
            "question_id": 18384375,
            "answer_id": 18388044,
            "creation_date": 1377195687,
            "last_activity_date": 1377195687,
            "score": 0,
            "is_accepted": false,
            "owner": {
                "user_id": 1745001,
                "display_name": "Ed Morton",
                "reputation": 10453,
                "user_type": "registered",
                "profile_image": "https://www.gravatar.com/avatar/99a3ebae89496eb16afe453aae97f5be?s=128&d=identicon&r=PG",
                "link": "https://stackoverflow.com/users/1745001/ed-morton"
            }
        },
        {
            "question_id": 18387447,
            "answer_id": 18388040,
            "creation_date": 1377195667,
            "last_activity_date": 1377195667,
            "score": 0,
            "is_accepted": false,
            "owner": {
                "user_id": 2494429,
                "display_name": "kpark91",
                "reputation": 140,
                "user_type": "registered",
                "profile_image": "https://www.gravatar.com/avatar/d903a03e7c5b6d9b21ff598c632de575?s=128&d=identicon&r=PG",
                "link": "https://stackoverflow.com/users/2494429/kpark91"
            }
        }

       ]
}

戻り値

JSONDecodeError at /
No JSON object could be decoded: line 1 column 0 (char 0)

simplejson を使用する代わりに、次のエラーが発生した json を試しました:

ValueError at /
No JSON object could be decoded

私が試して失敗したこと:

同じ問題を抱えているstackoverflowで質問の回答を試しましたが、明確な解決策はありませんでしたが、すべてが何らかの形で私を助けてくれました

1)jsonコンテンツのエンコーディングが正しいかどうかを確認しました

>>obj.info()

Content-Type: application/json; 
charset=utf-8
Content-Length: 2398

2) utf-8 で response_str をデコードしました

json.loads(response_str).decode("utf-8")

3) jsonlint を使用して、json 応答の形式を確認しました

Parse error on line 1:

^
Expecting '{', '['

驚くべきことに、のリンクをたどると私の睡眠が救われました。 JSONDecodeError: 期待値: 行 1 列 1 (文字 0)

基本的に、両方のケースで正確なコードを使用して json 応答を取得していましたが、2 番目の json 応答の何が問題なのか、2 番目の json 応答の構造が最初のものとは異なることに気付いただけです。

問題を理解するための説明を提供してください。

4

3 に答える 3

7

アドバイスをさせてください。使用するurllibのは素晴らしいことですが、多くの問題が発生します。だから、私はあなたの痛みを救い、ただあなたをに導きましょうrequests. URL リクエストを処理する最良の方法です。

この短い IDLE セッションでは、次のことを示します。

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

インストールするには、コマンド プロンプトに移動してpip install requets. requets は無料でオープン ソースであり、ピュア python で記述されているため、インストールは簡単です。

実演するビデオを次に示します。 ここに画像の説明を入力

あなたの特定の問題: ここに画像の説明を入力

于 2013-08-22T18:57:24.533 に答える
4

よく眠る方法の 1 つは、requestsを使用することです。

import requests
import simplejson

response = requests.get("https://api.stackexchange.com/2.1/answers?order=desc&sort=activity&site=stackoverflow")
response_json = simplejson.loads(response.text)
print response_json

エラーはありません。動作します。

于 2013-08-22T18:56:04.117 に答える
0

他の回答はライブラリに言及していrequestsますが、StackOverflow に関する他の回答に基づいて、コードを変更して GZip 解凍を含めることもできるようです。この回答に基づいて、これは次のようになると思います。

import StringIO, gzip 

obj = urllib.urlopen("https://api.stackexchange.com/2.1/answersorder=desc&sort=activity&site=stackoverflow")
data = StringIO.StringIO(obj.read())
gzipper = gzip.GzipFile(fileobj=data)
response_json = simplejson.loads(gzipper.read())
于 2013-08-22T19:14:11.150 に答える