过去几个小时我一直盯着这个,我正在试图弄清楚如何浏览这个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”值的列表中。如何查看所有数据并最终获得一个可以从中获取的大型列表?
答案 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']