JSONDecodeError:期望值:第1行第1列(char 0)

我得到错误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)
1695533 次浏览

你的代码产生了一个空的响应体,你会想要检查它或者捕获异常。有可能服务器响应了204 No Content响应,或者返回了一个非200范围的状态码(404 Not Found等)。检查这个。

注意:

  • 没有必要使用simplejson库,Python中包含了与json模块相同的库。

  • 没有必要解码从UTF8到unicode的响应,simplejson / json .loads()方法可以原生处理UTF8编码的数据。

  • pycurl有一个非常古老的API。除非您对使用它有特定的要求,否则还有更好的选择。

requestshttpx提供了更友好的api,包括JSON支持。如果可以,把你的电话换成:

import requests


response = requests.get(url)
response.raise_for_status()  # raises exception when not a 2xx response
if response.status_code != 204:
return response.json()

当然,这并不能保护您免受不符合HTTP标准的URL的影响;当可能使用任意url时,检查服务器是否打算通过检查Content-Type头来给你JSON,并捕捉异常:

if (
response.status_code != 204 and
response.headers["content-type"].strip().startswith("application/json")
):
try:
return response.json()
except ValueError:
# decide how to handle a server that's misbehaving to this extent

检查响应数据体,是否有实际数据,数据转储格式是否正确。

在大多数情况下,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()

注意:数据中的引号必须正确转义

使用requests lib, JSONDecodeError可以在遇到404这样的http错误代码时发生,并尝试将响应解析为JSON !

您必须首先检查200 (OK)或让它在错误时抛出以避免这种情况。

请注意:正如Martijn Pieters在评论中所述,可以服务器在出现错误时使用JSON响应(这取决于实现),因此检查Content-Type报头更可靠。

即使在调用decode()之后,也可能有嵌入的0。使用替代():

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响应。

我在请求(python库)方面也遇到了同样的问题。它恰好是accept-encoding头文件。

它是这样设置的:'accept-encoding': 'gzip, deflate, br'

我只是从请求中删除它,并停止得到错误。

检查文件的编码格式,读取文件时使用相应的编码格式。它会解决你的问题。

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

很多时候,这是因为你试图解析的字符串是空的:

>>> 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 code/logic here
x = {}

一定要记得在文件的内容上调用json.loads(),而不是JSON的文件路径:

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


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

我认为很多人都会时不时地这样做(包括我自己):

contents = json.load(json_file_path)

对我来说,它没有在请求中使用身份验证。

对我来说,这是服务器响应的东西,而不是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

如果您是Windows用户,Tweepy API可以在数据对象之间生成空行。由于这种情况,您可能会得到“JSONDecodeError: expected 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
< p >参考: # EYZ0 < / p >

只需检查请求的状态码是否为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"

我在一个基于python的web API的响应.text中收到了这样一个错误,但它把我带到了这里,所以这可能会帮助其他人解决类似的问题(当使用requests时,很难在搜索中过滤响应和请求问题..)

使用json.dumps()请求 data参数创建一个正确转义的JSON字符串发布之前,为我修复了这个问题

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

我遇到了同样的问题,当打印出从json文件中打开的json字符串时,发现json字符串以''开头,通过做一些研究,这是因为文件默认是用UTF-8解码的,通过将编码改为UTF-8 -sig,标记被剥离,加载json没有问题:

open('test.json', encoding='utf-8-sig')

我有同样的问题,试图读取json文件

json.loads("file.json")

我用

with open("file.json", "r") as read_file:
data = json.load(read_file)

也许这个对你有帮助

在我的情况下,这是因为服务器偶尔会给出http错误。所以基本上偶尔我的脚本得到这样的响应,而不是预期的响应:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<h1>502 Bad Gateway</h1>
<p>The proxy server received an invalid response from an upstream server.<hr/>Powered by Tengine</body>
</html>

显然,这不是json格式,试图调用.json()将产生JSONDecodeError: Expecting value: line 1 column 1 (char 0)

您可以打印导致此错误的确切响应,以便更好地调试。 例如,如果你正在使用requests,然后简单地打印.text字段(在你调用.json()之前)就可以了

我也遇到过同样的问题,我是这样解决的:

import json


with open("migrate.json", "rb") as read_file:
data = json.load(read_file)

我做了:

  1. 打开test.txt文件,写入数据
  2. 打开test.txt文件,读取数据

所以我没有在1点后关闭文件。

我添加了

outfile.close()

现在起作用了

当你想在python中加载json文件时,这是我发现的最简单的解决方案

import json
data = json.load(open('file_name.json'))

如果这个错误提示字符在X和Y位置不匹配,那么只需在open圆括号内添加encoding='utf-8'

data = json.load(open('file_name.json', encoding='utf-8'))

< >强解释 open打开文件并读取稍后在json.load中解析的包含

请注意,使用with open() as f比上面的语法更可靠,因为它确保文件在执行后关闭,完整的语法将是什么

with open('file_name.json') as f:
data = json.load(f)

在我的例子中,我在if和else块中执行了两次file.read(),这导致了这个错误。所以请确保不要犯这个错误并在变量中保留contains并多次使用变量。

如果你使用header和"Accept-Encoding": "gzip, deflate, br"安装brotli库和pip install。你不需要将brotli导入py文件。

在我的例子中,这是一个简单的解决方案,用双引号替换单引号。 你可以找到我的答案在这里

在我的情况下,它发生了,因为我读取文件的数据使用file.read(),然后尝试使用json.load(file)解析它。我通过将json.load(file)替换为json.loads(data)来解决这个问题

不能工作的代码

with open("text.json") as file:
data=file.read()
json_dict=json.load(file)

工作代码

with open("text.json") as file:
data=file.read()
json_dict=json.loads(data)