web-dev-qa-db-ja.com

JSONDecodeError:期待値:1行1列1(char 0)

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

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)
150
user1328021

コメントで会話をまとめるには:

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

  • UTF8からUnicodeへの応答をデコードする必要はありません。simplejson/json.loads()メソッドはUTF8でエンコードされたデータをネイティブに処理できます。

  • pycurlは非常に古風なAPIを持っています。使用するための特別な要件がない限り、より良い選択があります。

requests はJSONサポートを含む最もフレンドリーなAPIを提供します。可能であれば、通話を次のように置き換えます。

import requests

return requests.get(url).json()
86
Martijn Pieters

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

ほとんどの場合、json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0)エラーの原因は:

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

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

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

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

注:データ内の引用符は正しくエスケープする必要があります

47
Lorenz Lo Sauer

requests lib JSONDecodeErrorを使用すると、404のようなhttpエラーコードがあり、その応答をJSONとして解析しようとすると発生する可能性があります。

この問題を回避するには、最初に200(OK)を確認するか、エラー時に発生させる必要があります。暗号化されていないエラーメッセージで失敗したことを願います。

_ note _ :コメントサーバーに記載されているMartijn Pietersがエラーの場合にはJSONで応答できるので(実装に依存します)、Content-Typeヘッダーをチェックするほうがより信頼性があります。

23

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
3
bryan

私は要求を使用してまさにこの問題を抱えていました。 Christophe Roussyに説明をありがとう。

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

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

APIから404応答が返ってきました。

1

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

>>> 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 = {}
1
Alex W

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

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

要求(pythonライブラリ)についても同じ問題がありました。たまたまaccept-encodingヘッダーです。

このように設定されています:'accept-encoding': 'gzip, deflate, br'

私は単にリクエストからそれを取り除き、エラーを受け取るのをやめました。

0
Seu Madruga