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)
コメントで会話をまとめるには:
simplejson
ライブラリを使用する必要はありません。同じライブラリがjson
モジュールとしてPythonに含まれています。
UTF8からUnicodeへの応答をデコードする必要はありません。simplejson
/json
.loads()
メソッドはUTF8でエンコードされたデータをネイティブに処理できます。
pycurl
は非常に古風なAPIを持っています。使用するための特別な要件がない限り、より良い選択があります。
requests
はJSONサポートを含む最もフレンドリーなAPIを提供します。可能であれば、通話を次のように置き換えます。
import requests
return requests.get(url).json()
応答データ本体を調べて、実際のデータが存在し、データダンプが適切にフォーマットされているように見えるかどうかを確認してください。
ほとんどの場合、json.loads
- JSONDecodeError: Expecting value: line 1 column 1 (char 0)
エラーの原因は:
最終的にエラーは最初の位置で文字列がすでに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()
注:データ内の引用符は正しくエスケープする必要があります
requests
lib JSONDecodeError
を使用すると、404のようなhttpエラーコードがあり、その応答をJSONとして解析しようとすると発生する可能性があります。
この問題を回避するには、最初に200(OK)を確認するか、エラー時に発生させる必要があります。暗号化されていないエラーメッセージで失敗したことを願います。
_ note _ :コメントサーバーに記載されているMartijn Pietersがエラーの場合にはJSONで応答できるので(実装に依存します)、Content-Type
ヘッダーをチェックするほうがより信頼性があります。
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
私は要求を使用してまさにこの問題を抱えていました。 Christophe Roussyに説明をありがとう。
デバッグするために、私は使用しました:
response = requests.get(url)
logger.info(type(response))
APIから404応答が返ってきました。
多くの場合、これは解析しようとしている文字列が空白であるためです。
>>> 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 = {}
ファイルのエンコード形式を確認し、ファイルの読み取り中に対応するエンコード形式を使用してください。それはあなたの問題を解決します。
with open("AB.json",encoding='utf-16', errors='ignore') as json_data:
data = json.load(json_data, strict=False)
要求(pythonライブラリ)についても同じ問題がありました。たまたまaccept-encoding
ヘッダーです。
このように設定されています:'accept-encoding': 'gzip, deflate, br'
私は単にリクエストからそれを取り除き、エラーを受け取るのをやめました。