Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析嵌套的JSON数据_Python_Json - Fatal编程技术网

Python 解析嵌套的JSON数据

Python 解析嵌套的JSON数据,python,json,Python,Json,此JSON输出来自MongoDB聚合查询。我基本上需要将嵌套数据JSON解析为以下值:“total”和“\u id”值 { 'ok': 1.0, 'result': [ { 'total': 142250.0, '_id': 'BC' }, { 'total': 210.88999999999996,

此JSON输出来自MongoDB聚合查询。我基本上需要将嵌套数据JSON解析为以下值:“
total”
“\u id”

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

            {
                'total': 1065600.0, 
                '_id': 'TK'
            }
            ]
}
我尝试了5种不同的技术来获得我需要的东西,但是在使用
json
simplejson
模块时遇到了问题

理想情况下,输出如下:

公元前142250.0年 210.889999996美元 1065600.0塔卡 这应该行得通

这应该行

import json

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

注意:来自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字符串必须以开头,而不是以“””;但它似乎是一个有效的Python文本,您可以使用它进行解析:


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

您从mongodb获得的响应似乎与dictionary类型对象兼容

{
    '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'
            }
    ]
}
以及:


您可以发布您尝试使用这两个模块的代码吗?正如cpburnz的回答中所提到的:问题是单引号和双引号字符。您需要双引号,然后简单调用
json.loads
就可以了(在切换之后,您的json字符串对我来说加载很好,并且很容易解析)。我想你的意思是
json
需要在注释行中加双引号。是的,我是反向写的。修复了。另一个好主意是制作unicode字符串。它并不总是需要的,但我发现它可以缓解json带来的许多麻烦。我不确定你为什么要回滚编辑。让其他人编辑你的答案是可以的。事实上,这是令人鼓舞的ed.我不知道你在做编辑。我注意到一些东西在我修正了各种打字错误后消失了好几次,所以我重新编辑以放回消失的东西(可能是因为编辑冲突?)OP暗示已经尝试过这一点(我想这与提到但未发布的代码类似).真正的问题是单引号的使用。事实上,OP说他尝试了5种不同的方法,但没有提到任何具体的方法。但很公平,不可能是这么简单的事情。是的,由于第一个答案中提到的原因,这不起作用。PyMongo在其输出中只给出了单数引号。OP暗示已经有了三种方法ed this(我认为这与提到但未发布的代码类似)。如果您正在构建依赖JSON的系统的一部分代码,那么真正的问题是使用单引号.Way,这是一个糟糕的解决方案。我无法充分强调,如果找到试图通过找到另一个解析工具来解析格式错误的JSON字符串来绕过JSON解析错误的代码,那将是多么糟糕的事情这是一种可接受的解决方法的情况非常小,因此值得向下投票。所有值都是单引号响应。>>>data=ast.literal_eval(str(response))>>>对于数据中的项[“result”]:print(“{total},{u id}.format(**item))虽然我想从我的Mongo实例中获取JSON,但现在必须这样做…@EMS:我在问题中没有看到JSON数据。因此我不使用JSON解析器来解析它。我编辑了答案,明确提到输入应该更改为JSON
142250.0, BC
210.89, USD
1065600.0, TK
{
    'ok': 1.0,  'result': [
        {
            'total': 142250.0, 
            '_id': 'BC'
        }, 
        {
            'total': 210.88999999999996,
             '_id': 'USD'
        }, 
        {
            'total': 1065600.0, 
            '_id': 'TK'
        }
    ]
}
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'])