python - 将 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]"
}
...
但是我想保持原来的值的类型,有什么方法吗?
解决方案
如果您有嵌套数组表示法,列表中的每一行是否也可能是一个 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'])
推荐阅读
- javascript - 在 JavaScript 中旋转人脸 (Node.js 10)
- xlsxwriter - 使用 xlswriter 向条形图添加趋势线
- javascript - 用于匹配不包含特定行的行的正则表达式
- lua - lua表字符串连接不正确
- java - 使用 Netty 向设备发送请求
- java - 尝试调用 Wiremock Stub 时连接被拒绝
- mysql - 无法为事务打开 JDBC 连接。Linux VPS 上用户 'root'@'localhost' 的访问被拒绝
- algorithm - 生成前 M 个 N-Bonacci 数的数组
- python - 在数据块上,我无法从文件中读取:/databricks/python/lib/python3.7/site-package/my_package
- javascript - 通过分页从 Rest API 调用加载所有数据需要太长时间,并且在加载所有内容之前无法执行任何操作