为什么 Python 无法解析此 JSON 数据?[关闭]

Why can't Python parse this JSON data? [closed]

提问人:michele 提问时间:5/14/2010 最后编辑:Karl Knechtelmichele 更新时间:7/2/2022 访问量:2697962

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

去年关闭。

去年,社群审查了是否要重新讨论这个问题,并关闭了这个问题:

原始关闭原因未解决

已锁定。这个问题及其答案被锁定,因为这个问题偏离了主题,但具有历史意义。它目前不接受新的答案或交互。

我的文件中有这个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 并提取其值?

Python JSON 解析

评论

1赞 jpmc26 5/19/2022
这里讨论了这个问题的现状。社区的共识是,这个问题“足够好”,在经过大量编辑后可以保留。如果您觉得自讨论以来发生了一些变化,请打开新的讨论。
4赞 cigien 7/2/2022
这个问题正在 meta 上第二次讨论

答:

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 使打开时间更长。pprintwithdata_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
如果我们想添加一列来计算“地图”有多少观测值,我们该如何编写这个函数?