【问题标题】:Parsing nested JSON data解析嵌套的 JSON 数据
【发布时间】:2022-02-15 02:20:42
【问题描述】:

此 JSON 输出来自 MongoDB 聚合查询。我基本上需要将嵌套数据 JSON 解析为以下 'total''_id' 值。

{
'ok': 1.0, 
'result': [
            {
                'total': 142250.0, 
                '_id': 'BC'
            }, 
            {
                'total': 210.88999999999996,
                 '_id': 'USD'
            }, 

            {
                'total': 1065600.0, 
                '_id': 'TK'
            }
            ]
}

我尝试了 5 种不同的技术来从中获取我需要的东西,但是我在使用 jsonsimplejson 模块时遇到了问题。

理想情况下,输出将是这样的:

142250.0, BC
210.88999999999996, USD
1065600.0, TK

【问题讨论】:

  • 你能贴出你尝试使用这两个模块的代码吗?
  • 正如 cpburnz 的回答中提到的:问题是单引号和双引号字符。你需要双引号,然后简单地调用json.loads 就可以了(你的 JSON 字符串在切换后对我来说加载得很好,并且很容易解析)。

标签: python json


【解决方案1】:

注意:您来自 MongoDB 的 JSON 响应实际上是无效的。 JSON 需要双引号 ("),而不是单引号 (')。

我不确定为什么您的回复使用单引号而不是双引号,但从外观上看,您可以替换它们,然后只需使用内置的 json 模块:

from __future__ import print_function
import json

response = """{
    'ok': 1.0, 
    'result': [
        {
            'total': 142250.0, 
            '_id': 'BC'
        }, 
        {
            'total': 210.88999999999996,
             '_id': 'USD'
        }, 

        {
            'total': 1065600.0, 
            '_id': 'TK'
        }
        ]
}"""

# JSON requires double-quotes, not single-quotes.
response = response.replace("'", '"')
response = json.loads(response)
for doc in response['result']:
    print(doc['_id'], doc['total'])

【讨论】:

  • 我认为您的意思是 json 需要在注释行中使用双引号。
  • 是的,我是倒着写的。固定。
  • 另一个好主意是制作 unicode 字符串。它并不总是需要,但我发现它可以减轻 JSON 的很多麻烦。
  • 我不确定您为什么要回滚编辑。可以让其他人编辑您的答案。事实上,这是值得鼓励的。
  • 我没有意识到您正在编辑。我注意到在修复了各种错别字后,有些东西消失了几次,所以我重新编辑以恢复消失的东西(可能是由于编辑冲突?)
【解决方案2】:

您从 mongodb 获得的响应似乎与字典类型对象兼容。作为

{
    'ok': 1.0,  'result': [
        {
            'total': 142250.0, 
            '_id': 'BC'
        }, 
        {
            'total': 210.88999999999996,
             '_id': 'USD'
        }, 
        {
            'total': 1065600.0, 
            '_id': 'TK'
        }
    ]
}

我们不能直接把它赋值给dict类型的对象,而不是把它放到多行字符串中,用双引号替换单引号。并对其执行进一步的操作,例如:

json_data = {
    'ok': 1.0,
    'result':
        [
            {
                'total': 142250.0,
                '_id': 'BC'
            },
            {
                'total': 210.88999999999996,
                '_id': 'USD'
            },
            {
                'total': 1065600.0,
                '_id': 'TK'
            }
    ]
}

还有:

for data in json_data['result']:
    print(data['total'], data['_id'])

【讨论】:

    【解决方案3】:
    import json
    
    data = json.loads(mongo_db_json)
    result = data['result']
    for value_dict in result:
        print '{0}, {1}'.format(value['total'], value['_id'])
    

    这应该可行

    【讨论】:

    • OP 暗示已经尝试过这个(我认为这类似于提到但未发布的代码)。真正的问题是单引号的使用。
    • 实际上OP说他尝试了5种不同的方法,没有提到任何具体方法。但很公平,不可能是这么简单的事情。
    • 是的,由于第一个答案中提到的原因,这不起作用。 PyMongo 仅在其输出中给出单引号。
    【解决方案4】:

    您的示例文本无效JSON text。 JSON 字符串必须以" quotation mark 开头,而不是';但它似乎是一个有效的 Python 文字,您可以使用 ast.literal_eval() function 解析:

    import ast
    
    data = ast.literal_eval(input_string)
    for item in data["result"]:
        print("{total}, {_id}".format(**item))
    

    Output

    142250.0, BC
    210.89, USD
    1065600.0, TK
    

    更好的方法可能是修复查询过程以获取有效的 JSON 并使用 json 模块对其进行解析。

    【讨论】:

    • 如果您要构建的代码是依赖 JSON 的系统的一部分,那将是一个糟糕的解决方案。我无法足够强调通过找到一个可以解析格式错误的 JSON 字符串的 different 解析工具来找到试图绕过 JSON 解析错误的代码是多么糟糕。可以接受的解决此问题的方法的情况很少,值得投反对票。
    • 所有值都是单引号响应。
    • >>> data = ast.literal_eval(str(response)) >>> for item in data["result"]: print("{total}, {_id}".format(* *项目))
    • 现在必须这样做,虽然我想真正从我的 Mongo 实例中获取 JSON...
    • @EMS:我没有在问题中看到 json 数据。因此我不使用 json 解析器来解析它。我已经编辑了答案,明确提到输入应该更改为 json
    【解决方案5】:

    这应该可以。

    import json
    
    def parse_json(your_json):
        to_dict = json.loads(your_json)
        for item in to_dict['results']:
            print item['total']
    

    【讨论】:

    • OP 暗示已经尝试过这个(我认为这类似于提到但未发布的代码)。真正的问题是单引号的使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2020-01-19
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多