我有一个源JSON,可以是任何潜在的格式。用于存储和处理目的,我想以2列格式保存这些数据。
例如,我想要以下JSON:
"record" {
"name1": "value1",
"name2": "value2",
"parameters": {
"param": {},
"paramSet": {
"items": [{
"id": "id1"
}, {
"id": "id2"
}]
}
}
}
要转换为以下类似CSV的格式:
record:name1 , "value1"
record:name2 , "value2"
record:parameters:param , ""
record:parameters:paramSet:items#0:id , "id1"
record:parameters:paramSet:items#1:id , "id2"
我的问题是:
提前致谢。
答案 0 :(得分:1)
首先,我让json正确:
{
"record": {
"name1": "value1",
"name2": "value2",
"parameters": {
"param": {},
"paramSet": {
"items": [
{
"id": "id1"
},
{
"id": "id2"
}
]
}
}
}
}
接下来是一些递归模拟json的代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
class Thing(object):
data = ''
output = []
def __init__(self, file_name):
with open(file_name) as data_file:
self.data = json.load(data_file)
def mock(self):
for (i, item) in enumerate(self.data):
if type(self.data[item]) == dict:
self._recursive(self.data[item], item)
for (i, data) in enumerate(self.output):
print(data)
def _recursive(self, request_data, path):
for (i, item) in enumerate(request_data):
if type(request_data[item]) == dict:
if len(request_data[item]) > 0:
path2 = "{}:{}".format(path, item)
self._recursive(request_data[item], path2)
else:
self.output.append("{}:{}, \"\"".format(path, item))
elif type(request_data[item]) == list:
for (j, list_item) in enumerate(request_data[item]):
path2 = "{}:{}#{}".format(path, item, j)
self._recursive(request_data[item][j], path2)
else:
self.output.append("{}:{}, {}".format(path, item, request_data[item]))
thing = Thing("input.json")
thing.mock()
以下代码将输出:
record:name1, value1
record:name2, value2
record:parameters:paramSet:items#0:id, id1
record:parameters:paramSet:items#1:id, id2
record:parameters:param, ""