JSONDecodeError:期待値:行1列1(文字0)


259

Expecting value: line 1 column 1 (char 0)JSONをデコードしようとするとエラーが発生します。

私がAPI呼び出しに使用するURLはブラウザーで正常に機能しますが、curlリクエストを介して実行すると、このエラーが発生します。以下は、curlリクエストに使用するコードです。

エラーは return simplejson.loads(response_json)

    response_json = self.web_fetch(url)
    response_json = response_json.decode('utf-8')
    return json.loads(response_json)


def web_fetch(self, url):
        buffer = StringIO()
        curl = pycurl.Curl()
        curl.setopt(curl.URL, url)
        curl.setopt(curl.TIMEOUT, self.timeout)
        curl.setopt(curl.WRITEFUNCTION, buffer.write)
        curl.perform()
        curl.close()
        response = buffer.getvalue().strip()
        return response

完全なトレースバック:

トレースバック:

File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
  620.     apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
  176.         return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
  455.         return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
  374.         obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
  393.         return self.scan_once(s, idx=_w(s, idx).end())

Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)

2
最後にprint repr(response_json)大事なことを言いますが、何があなたに渡されているの.loads()ですか?
Martijn Pieters

4
もう1つ:simplejsonstdlib json(と同じライブラリsimplejson)を使用できるのになぜ使用するのですか?
Martijn Pieters

3
それは空の文字列です。あなたのweb_fetch() 呼び出しに失敗しました。
Martijn Pieters

1
はい、私よりも使いやすいものを使用することをお勧めしますpycurlrequests特に何が起こっているのかをデバッグすることに関しては、はるかに簡単なAPIを提供します。あなたが特にない限り、持っている新しいバージョンの持っているsimplejsonだけに固執、ライブラリをjson、あなたが管理する依存関係が保存されます。
Martijn Pieters

1
response_jsonの戻り値は.json()?その後、すでにデータをデコードしおり、json.loads()もう使用する必要はありません。responseあなたのためにそれをデコードしました。
Martijn Pieters

回答:


125

コメントで会話を要約するには:

  • simplejsonライブラリを使用する必要はありません。同じライブラリがjsonモジュールとしてPythonに含まれています。

  • ユニコードへのUTF8からの応答をデコードする必要はありませんsimplejson/のjson .loads()方法は、UTF8でネイティブに符号化データを扱うことができます。

  • pycurl非常に古いAPIがあります。それを使用するための特定の要件がない限り、より良い選択肢があります。

requestsJSONサポートを含む、最も使いやすいAPIを提供します。可能であれば、通話を次のように置き換えます。

import requests

return requests.get(url).json()

93
を使用してこれと同じエラーが発生していrequestsます!トレースrequestscomplexjson、を使用することを示唆しているようsimplejsonです。変だ。
rayu 2016

@Rayu:可能であればリクエストが使用されsimplejsonます。Python stdlibにバンドルされているリリースではなく、最新のsimplejsonリリースを使用したい人もいます。
Martijn Pieters

5
"simplejsonライブラリを使用する必要はありません。同じライブラリがPythonにjsonモジュールとして含まれています。" ...私は敬遠します。simplejson内部でビルトインを使用しますが、jsonより記述的なエラーを提供します。この場合、を使用jsonすると、一般的なが提供されますValueError: No JSON object could be decoded
BoltzmannBrain 2016

2
これはアボートまたは不完全なjsonが原因で発生する可能性がありますか?これをたまにランダムに取得しますが、再現方法がわかりません。
Christophe Roussy

2
@ChristopheRoussy:はい、それが質問のポイントです(OPは空の u''応答を受け取りました)。あなたはJSONDecodeErrorそれがエラーに遭遇する前に多くのデータが正常に解析された指示します。これは、その時点で無効なデータ(不正な形式または破損したJSONドキュメント)があるか、データが切り捨てられたことが原因である可能性があります。
Martijn Pieters

64

実際のデータが存在し、データダンプが適切にフォーマットされているように見えるかどうか、応答のデータ本体を確認します。

ほとんどの場合、あなたのjson.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0)エラーがによるものです。

  • JSONに準拠しない引用
  • XML / HTML出力(つまり、<で始まる文字列)、または
  • 互換性のない文字エンコーディング

最終的にエラーは、最初の位置では文字列がすでにJSONに準拠していないことを示しています。

したがって、一見JSONのように見えるデータ本体があるにもかかわらず解析が失敗する場合は、データ本体の引用符を置き換えてみてください。

import sys, json
struct = {}
try:
  try: #try parsing to dict
    dataform = str(response_json).strip("'<>() ").replace('\'', '\"')
    struct = json.loads(dataform)
  except:
    print repr(resonse_json)
    print sys.exc_info()

注:データ内の引用符は適切にエスケープする必要があります


4
コメントでは、OPが空の応答を受け取ったことが明らかでした。以来requests.get(url).json()だけで動作し、JSONは、いずれかの奇形されていません。
Martijn Pieters

JSONDecodeError: Expecting value: line 1 column 1 (char 0)具体的には、空の文字列がjsonデコードに渡されるときに発生します
wesinat0r

JSONDecodeError: Expecting value: line 1 column 1 (char 0)json応答の最初の行が無効な場合にも発生します。az cliコマンドの実行からの応答例は["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',です。これは私にここで私を導くエラーを与えました。応答の残りの部分は有効なjsonオブジェクトです。ちょうどその最初の行が物事を壊します。
SeaDude

34

ではrequestslibにJSONDecodeErrorあなたは404のようなHTTPエラーコードを持っており、JSONなどの応答を解析しようとすると発生する可能性があります!

このケースを回避するには、最初に200(OK)を確認するか、エラー時に発生させる必要があります。私はそれがより不可解なエラーメッセージで失敗したことを望みます。

:コメントサーバーに記載されているMartijn Pietersはエラーの場合にJSONで応答できるため(実装によって異なります)、Content-Typeヘッダーのチェックの信頼性が高くなります。


以前のコメントは申し訳ありませんが、例にリンクできますか?私は自分のスキルを「アクションを実行する」から「アクションの実行を試み、応答を返し、それに応じて反応する」ようにしています。
dcclassics 2017年

@dcclassics:例:サーバー側で失敗し、サーバーはJSONで応答する代わりにエラーページ(HTML)を表示して応答するため、応答を解析するコードはJSONを読み取ろうとしますが、HTMLタグでは失敗します。
Christophe Roussy

1
サーバーはJSONボディをエラー応答に含めることができます。200のOK応答だけではありません。Content-Typeヘッダーを確認します。
Martijn Pieters

29

JSONファイル自体のコンテンツを解析する場合は、そのJSONのファイルパスではなく、ファイルjson.loads()コンテンツを実際に呼び出していることを確認するために、健全性チェックが役立つ場合があることに言及する価値があると思います:

json_file_path = "/path/to/example.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())

私はこれが時々起こる可能性があることを認めて少し恥ずかしいです:

contents = json.loads(json_file_path)

まあ..それは時々起こります。おかげでそれはうまくいきました。
Sachin Kumar

その場合はjson.load()代わりに使うべきだと思います。
Coddy

13

ファイルのエンコード形式を確認し、ファイルの読み取り中に対応するエンコード形式を使用してください。それはあなたの問題を解決します。

with open("AB.json", encoding='utf-8', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

3
これは、の小さな変更でencoding='utf-8'うまくいきました。そのため、いくつかのことを試してみる必要があると思います。
RobertMyles

9

多くの場合、これは、解析しようとしている文字列が空白であるためです。

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

json_stringが空かどうかを事前に確認することで解決できます。

import json

if json_string:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}

私のコードでさらにデバッグしている間、私は呼び出しresponse.read()ていましたが、別の呼び出しが原因となったときExpecting value: line 1などにがっかりしました。デバッグ文を削除して問題を解決しました。
Joe

デバッグするには、この素晴らしいWebサイトjsonlint.comを
Roelant

4

decode()を呼び出した後でも、埋め込まれた0がある場合があります。replace()を使用します。

import json
struct = {}
try:
    response_json = response_json.decode('utf-8').replace('\0', '')
    struct = json.loads(response_json)
except:
    print('bad json: ', response_json)
return struct

2

私はリクエストを使用してまさにこの問題を抱えていました。説明をしてくれたChristophe Roussyに感謝します。

デバッグするために、私は使用しました:

response = requests.get(url)
logger.info(type(response))

APIから404応答が返されました。


1
response.status_codeまたはに簡略化できますprint(response.status_code)
TitanFighter

1

リクエスト(Pythonライブラリ)でも同じ問題が発生していました。それはたまたまaccept-encodingヘッダーでした。

それはこのように設定されました: 'accept-encoding': 'gzip, deflate, br'

私は単にリクエストからそれを削除し、エラーの発生を止めました。



1

私にとっては200以外のサーバー応答であり、応答はjson形式ではありませんでした。私はjsonが解析する前にこれをやった:

# this is the https request for data in json format
response_json = requests.get() 

# only proceed if I have a 200 response which is saved in status_code
if (response_json.status_code == 200):  
     response = response_json.json() #converting from json to dictionary using json library

これは私にとって問題でした。ステータスコードは200ではなく500(内部サーバーエラー)だったため、jsonは返されなかったため、jsonの1行目のcol 1には何もありませんでした。リクエストステータスコードが想定どおりであることを常に確認してください。
thposs

0

Windowsユーザーの場合、Tweepy APIはデータオブジェクト間に空の行を生成できます。このため、「JSONDecodeError:Expecting value:line 1 column 1(char 0)」エラーが発生する可能性があります。このエラーを回避するには、空の行を削除します。

例えば:

 def on_data(self, data):
        try:
            with open('sentiment.json', 'a', newline='\n') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

参照: TwitterストリームAPIはNoneからJSONDecodeError( "Expecting value"、s、err.value)を提供します


空の行は問題ではないと思います。エラーは1行1列目にあることが明確に示されています。この回避策は、ファイルからBOMを削除しているために機能すると思います。1.元のファイルのサイズを確認し(右クリック> [プロパティ])、134.859バイトにすることができます2.元のファイルをNotepad ++で開きます3.エンコードを "UTF-8-BOM"から " UTF-8」。保存4.サイズをもう一度確認します。約134.856(3バイト少ない)
Alex 75

0

リクエストのステータスコードが200かどうかを確認します。たとえば、次のようにします。

if status != 200:
    print("An error has occured. [Status code", status, "]")
else:
    data = response.json() #Only convert to Json when status is OK.
    if not data["elements"]:
        print("Empty JSON")
    else:
        "You can extract data here"

0

PythonベースのウェブAPIの応答.textでこのようなエラーを受け取りましたが、ここに誘導されたため、同様の問題を抱えている他のユーザーに役立つ可能性があります(requests.. を使用する場合、検索で応答をフィルタリングして問題を要求することは非常に困難です。)

使用json.dumps()上の要求 data掲示が私のために問題を修正する前にJSONの正しくエスケープされた文字列を作成するために、引数

requests.post(url, data=json.dumps(data))

0

同じ問題が発生しましたが、jsonファイルから開いたjson文字列を出力すると、json文字列が ''で始まることがわかりました。これは、ファイルをデフォルトでUTF-8でデコードしているためです。エンコーディングをutf-8-sigに変更すると、マークアウトが取り除かれ、jsonが問題なく読み込まれます。

open('test.json', encoding='utf-8-sig')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.