格式化 json 个文件以方便阅读
format json files to pretty reading
我得到了一个 json 文件,其结构如下所示:
{
"data": {
"msg": "success",
"data": {
"levelConfigList": "name,id\n1,10001\n2,10002\n3,10004\n4,10003\n5,10005",
"profitConfigList": "id,num,list\n1,1.042,\"[16,17,19,20,21,23,24,26,28,30,32,34,36,40]\"\n2,1.042,\"[17,18,20,21,22,24,25,27,29,31,33,35,37,41]\""
}
}
我可以通过转换为 .yaml 格式使其更具可读性,但首选如下所示的 .json 文件:
{
"data": {
"msg": "success",
"data": {
"levelConfigList": [
{
"name": 1,
"id": 10001
},
{
"name": 2,
"id": 10002
}
]
}
}
}
我手动用python做的不正经:
import json
from csv import reader
with open('test.json', 'r', encoding='utf-8') as f:
jsd = f.read()
jsd = json.loads(jsd)
# split json value to list
jsline = jsd['data']['data'][key].splitlines()
list_dict = list(reader(jsline))
# map the first item in list as key and the rest each as value, and combine together
newdict = []
for i in list_dict[1:]:
newdict.append((dict(zip(list_dict[0], i))))
jsd['data']['data'][key] = newdict
最后,用for key in jsd['data']['data']:
遍历所有的键值并替换它们,终于得到了结果。有没有更好的方法来完成这项工作?
此外,这种方法的不足之处在于我的值都是字符串:
...
"profitConfigList": [
{
"id": "1",
"num": "1.042",
"list": "[16,17,19,20,21,23,24,26,28,30,32,34,36,40]"
}
...
但是我想保持原来的值的类型,有什么方法吗?
如果你有一个嵌套数组符号,列表中的每一行是否也可能是一个 json 对象?
在这种情况下,您可以这样做:
def parse_nested_list(x):
lines = x.splitlines()
lines = list(csv.DictReader(lines))
return [{k: json.loads(v) for k, v in line.items()} for line in lines
jsd['data']['data']['profitConfigList'] = parse_nested_list(jsd['data']['data']['profitConfigList'])
jsd['data']['data']['levelConfigList'] = parse_nested_list(jsd['data']['data']['levelConfigList'])
我得到了一个 json 文件,其结构如下所示:
{
"data": {
"msg": "success",
"data": {
"levelConfigList": "name,id\n1,10001\n2,10002\n3,10004\n4,10003\n5,10005",
"profitConfigList": "id,num,list\n1,1.042,\"[16,17,19,20,21,23,24,26,28,30,32,34,36,40]\"\n2,1.042,\"[17,18,20,21,22,24,25,27,29,31,33,35,37,41]\""
}
}
我可以通过转换为 .yaml 格式使其更具可读性,但首选如下所示的 .json 文件:
{
"data": {
"msg": "success",
"data": {
"levelConfigList": [
{
"name": 1,
"id": 10001
},
{
"name": 2,
"id": 10002
}
]
}
}
}
我手动用python做的不正经:
import json
from csv import reader
with open('test.json', 'r', encoding='utf-8') as f:
jsd = f.read()
jsd = json.loads(jsd)
# split json value to list
jsline = jsd['data']['data'][key].splitlines()
list_dict = list(reader(jsline))
# map the first item in list as key and the rest each as value, and combine together
newdict = []
for i in list_dict[1:]:
newdict.append((dict(zip(list_dict[0], i))))
jsd['data']['data'][key] = newdict
最后,用for key in jsd['data']['data']:
遍历所有的键值并替换它们,终于得到了结果。有没有更好的方法来完成这项工作?
此外,这种方法的不足之处在于我的值都是字符串:
...
"profitConfigList": [
{
"id": "1",
"num": "1.042",
"list": "[16,17,19,20,21,23,24,26,28,30,32,34,36,40]"
}
...
但是我想保持原来的值的类型,有什么方法吗?
如果你有一个嵌套数组符号,列表中的每一行是否也可能是一个 json 对象?
在这种情况下,您可以这样做:
def parse_nested_list(x):
lines = x.splitlines()
lines = list(csv.DictReader(lines))
return [{k: json.loads(v) for k, v in line.items()} for line in lines
jsd['data']['data']['profitConfigList'] = parse_nested_list(jsd['data']['data']['profitConfigList'])
jsd['data']['data']['levelConfigList'] = parse_nested_list(jsd['data']['data']['levelConfigList'])