python2.7 - JSON数组与更简单的列表映射?

时间:2017-10-03 06:19:02

标签: python json

过去几个小时我一直盯着这个,我正在试图弄清楚如何浏览这个JSON数据并最终得到一个相当简单的CSV。

我之前做过类似的事情,但它是在一段时间之前,我最终将所有JSON数据转换为xml并使用元素树来构建标题和大量循环。这是一个繁琐的编码,在我走这条路之前,我想我会看到是否有更简单的方法来获得我需要的东西。

我正在调用在线资源,我正在收回这样的数据,我以前从未在JSON中处理过地图。我在一个名为“jdata”的变量中有以下json

            {
                "array": {
                    "headers": ["time",
                    "s_id",
                    "loc_id",
                    "total_1",
                    "total_2",
                    "total_3",
                    "total_4",
                    "total_5"],
                    "m_data": {
                        "end": 1506816000,
                        "map": {
                            "s_id": {
                                "284": "Test12",
                                "13": "AnotherTest4",
                                "5595": "GoogleTest"
                            },
                            "loc_id": {
                                "1": "Unknown",
                                "2": "",
                                "3": "NYC"
                                }
                        },
                        "start": 1506816000,
                        "status": "OK"
                    },
                    "data": [

                    [1506816000,
                    284,
                    3,
                    5350,
                    59202191,
                    null,
                    25499830,
                    938247],

                    [1506816000,
                    13,
                    1,
                    81623,
                    2527480526,
                    null,
                    372601901,
                    13993534],

                    [1506816000,
                    5595,
                    3,
                    61331,
                    40157029547,
                    null,
                    15268999464,
                    60112032]]
                }
            }

我想要的是数据部分(可能有数千个)。问题是数据有一个地图而不是硬设置我需要的两个值。 (s_id和loc_id)

有没有办法浏览所有数据键和

而不是:

                    284,3,5350,59202191,null,25499830,938247

我希望以这样的行结束所有数据部分:

                    Test12,NYC,5350,59202191,null,25499830,938247

我实际上可以自己完成所有的CSV内容,如果我可以将所有数据条目放入带有“map”值而不是“id”值的列表中。如何查看所有数据并最终获得一个可以从中获取的大型列表?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

def get_value(s_map, loc_map, value_id):
    value_id = str(value_id)
    if value_id in s_map:
        return s_map[value_id]
    elif value_id in loc_map:
        return loc_map[value_id]
    else:
        return value_id


def parse_data(data):
    s_map = data['array']['m_data']['map']['s_id']
    loc_map = data['array']['m_data']['map']['loc_id']

    for element in data['array']['data']:
        element_values = [get_value(s_map, loc_map, val) for val in element]
        yield element_values

对于您的示例数据:

for element in parse_data(data):
    print(element)

> ['1506816000', 'Test12', 'NYC', '5350', '59202191', 'None', '25499830', '938247']
> ['1506816000', 'AnotherTest4', 'Unknown', '81623', '2527480526', 'None', '372601901', '13993534']
> ['1506816000', 'GoogleTest', 'NYC', '61331', '40157029547', 'None', '15268999464', '60112032']

答案 1 :(得分:1)

希望这就是你要找的东西

import json
jdata = '''above json'''
pdata = json.loads(jdata)  # converts json to Python data type
map_data = pdata["array"]["m_data"]["map"]
s_id = map_data['s_id']
loc_id = map_data['loc_id']