提问人:michele 提问时间:5/14/2010 最后编辑:Karl Knechtelmichele 更新时间:7/2/2022 访问量:2697962
为什么 Python 无法解析此 JSON 数据?[关闭]
Why can't Python parse this JSON data? [closed]
问:
闭。这个问题不可重现或是由错别字引起的。它目前不接受答案。
这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。
去年关闭。
去年,社群审查了是否要重新讨论这个问题,并关闭了这个问题:
原始关闭原因未解决
已锁定。这个问题及其答案被锁定,因为这个问题偏离了主题,但具有历史意义。它目前不接受新的答案或交互。
我的文件中有这个JSON:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [
"id": "valore"
],
"om_points": "value",
"parameters": [
"id": "valore"
]
}
我编写了这个脚本来打印所有 JSON 数据:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
但是,此程序会引发一个异常:
Traceback (most recent call last):
File "<pyshell#1>", line 5, in <module>
data = json.load(f)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)
如何解析 JSON 并提取其值?
答:
2193赞
Justin Peel
5/15/2010
#1
您的数据不是有效的 JSON 格式。当你应该拥有 和 元素时,你有:[]
{}
"masks"
"parameters"
[]
用于 JSON 数组,这些数组在 Python 中调用list
{}
用于在 Python 中调用的 JSON 对象dict
以下是 JSON 文件的外观:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": {
"id": "valore"
},
"om_points": "value",
"parameters": {
"id": "valore"
}
}
然后,您可以使用您的代码:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
使用数据,您现在还可以找到如下值:
data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]
尝试一下,看看它是否开始有意义。
评论
0赞
radtek
12/24/2014
序列化数据用 [] 包装,当你读进去时,你需要 f.read(),也就是说,如果你使用标准。
5赞
diaryfolio
1/30/2015
感谢您的解决方案。我在打印时收到一个 Unicode 符号。(例如:u'valore' )。如何预防?
6赞
CodyBugstein
7/5/2015
不错,但是python在每个键之前添加一个。知道为什么吗?u'
7赞
Michael P
8/29/2015
这就是为什么您的文本是 unicode 类型而不是字符串。大多数时候,最好使用unicode文本进行德语变音符号以及与其他模块/程序等共享文本结果。所以你很好!
0赞
Karthi
4/26/2017
在此示例中,如何知道要控制索引的映射数组的大小?data[“maps”][0][“id”] - 这里 0 硬编码。
322赞
Bengt
11/30/2012
#2
您的应如下所示:data.json
{
"maps":[
{"id":"blabla","iscategorical":"0"},
{"id":"blabla","iscategorical":"0"}
],
"masks":
{"id":"valore"},
"om_points":"value",
"parameters":
{"id":"valore"}
}
您的代码应该是:
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
pprint(data)
请注意,这仅适用于 Python 2.6 及更高版本,因为它取决于 with
-语句。在 Python 2.5 中使用 ,在 Python <= 2.4 中,请参阅 Justin Peel 的答案,该答案基于该答案。from __future__ import with_statement
现在,您还可以访问单个值,如下所示:
data["maps"][0]["id"] # will return 'blabla'
data["masks"]["id"] # will return 'valore'
data["om_points"] # will return 'value'
评论
0赞
Steve S.
6/16/2015
参考 2.6 文档 (docs.python.org/2.6/library/io.html),在“with”上下文中打开文件将自动关闭该文件。
1赞
Bengt
6/17/2015
@SteveS。是的,但不是在离开上下文之前。在 -context 中,ing 使打开时间更长。pprint
with
data_file
0赞
Gayan Pathirage
3/15/2017
有没有办法像data.om_points或 data.masks.id 一样访问?
0赞
Patrick Schaefer
4/4/2017
这有效,除非我尝试使用编号索引,例如我看到错误:data["maps"][0]["id"]
KeyError: 0
1赞
Nuhman
5/25/2018
@GayanPathirage您像 , .这个想法是你可以通过指定“键路径”来达到字典中的任何级别。如果出现异常,则表示路径中不存在密钥。注意错别字或检查字典的结构。data["om_points"]
data["masks"]["id"]
KeyError
5赞
Ramapati Maurya
11/7/2017
#3
在这里,您可以使用修改后的文件:data.json
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [{
"id": "valore"
}],
"om_points": "value",
"parameters": [{
"id": "valore"
}]
}
您可以使用以下行在控制台上调用或打印数据:
import json
from pprint import pprint
with open('data.json') as data_file:
data_item = json.load(data_file)
pprint(data_item)
的预期输出 :print(data_item['parameters'][0]['id'])
{'maps': [{'id': 'blabla', 'iscategorical': '0'},
{'id': 'blabla', 'iscategorical': '0'}],
'masks': [{'id': 'valore'}],
'om_points': 'value',
'parameters': [{'id': 'valore'}]}
的预期输出 :print(data_item['parameters'][0]['id'])
valore
评论
0赞
Chenxi
6/8/2018
如果我们想添加一列来计算“地图”有多少观测值,我们该如何编写这个函数?
评论