首页 > 解决方案 > 将 json 文件格式化为漂亮的阅读

问题描述

我得到了一个结构如下的 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]"
            }
     ...

但是我想保持原来的值的类型,有什么方法吗?

标签: pythonjsondata-science

解决方案


如果您有嵌套数组表示法,列表中的每一行是否也可能是一个 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'])

推荐阅读