Python 3 中的 JSONdecoder 错误。来自 API 的 Json

Posted

技术标签:

【中文标题】Python 3 中的 JSONdecoder 错误。来自 API 的 Json【英文标题】:JSONdecoder Error in Python 3. Json from API 【发布时间】:2019-11-15 13:06:05 【问题描述】:

我有一个代码:

dguid='2016A0011M4B'
income='7'
ethnic='3'
language='10'
url = 'https://www12.statcan.gc.ca/rest/census-recensement/CPR2016.json?lang=E&dguid=&topic=&notes=1'.format(
    dguid,
    ethnic)

!wget -q -O 'data.json' url
with open('data.json') as json_data:
data = json.load(json_data)

它给了我一个错误 enter image description here

----------------------------------- ---------------------------- JSONDecodeError Traceback(最近调用 最后)在() 9 get_ipython().system("wget -q -O 'data.json' url") 10 使用 open('data.json') 作为 json_data: ---> 11 数据 = json.load(json_data)

/opt/conda/envs/DSX-Python35/lib/python3.5/json/init.py 负载(fp,cls,object_hook,parse_float,parse_int,parse_constant, object_pairs_hook, **kw) 第266章 第267章 --> 268 parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw) 269 270

/opt/conda/envs/DSX-Python35/lib/python3.5/json/init.py 加载(s,编码,cls,object_hook,parse_float,parse_int, parse_constant, object_pairs_hook, **kw) 317 parse_int 为 None 且 parse_float 为 None 且 318 parse_constant 是 None 并且 object_pairs_hook 是 None 而不是 kw): --> 319 返回 _default_decoder.decode(s) 如果 cls 为无,则为 320: 321 cls = JSON解码器

/opt/conda/envs/DSX-Python35/lib/python3.5/json/decoder.py 解码(自我,s,_w) 337 第338章 --> 339 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 340结束=_w(s,结束).end() 第341章

/opt/conda/envs/DSX-Python35/lib/python3.5/json/decoder.py raw_decode(self, s, idx) 第355章 356 除了 StopIteration 作为错误: --> 357 从无引发 JSONDecodeError("Expecting value", s, err.value) 358 返回对象,结束

JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

怎么了?

【问题讨论】:

如果我使用加载而不是加载方法,它会给我错误:JSON 对象必须是 str,而不是 'TextIOWrapper' !wget -q -O 'data.json' url 看起来不像是有效的 Python 代码... 有一些数据科学笔记本交互界面,例如 Jupyter/Ipython,支持运行类似的 shell 命令(例如在 python 代码中间)。像这样:twitter.com/python_tip/status/929984742421942272/photo/1 【参考方案1】:

该 URL 返回的 JSON 无效。异常清楚地表明了这一点。

JSON 负载有一个前缀“//”,这会使 JSON 无效:

//"COLUMNS":["PROV_TERR_ID","PROV_TERR_NAME_NOM",...

您必须去掉前 2 个字符。你可以这样做:

with open('data.json') as json_data:
    line = json_data.readlines()
    line[0] = line[0][2:]
    data = json.loads(line[0])
    print(data)

在 python 3.6.1 中测试正确

【讨论】:

以上是关于Python 3 中的 JSONdecoder 错误。来自 API 的 Json的主要内容,如果未能解决你的问题,请参考以下文章

python字典转化成json格式。JSONEncoder和JSONDecoder两个类来实现Json字符串和dict类型数据的互相转换

用于 API 的 JSONDecoder 和文本视图结构中的数据的问题

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

如何使用 JSONDecoder 根据订单键获取排序数据?