错误的JSON到自定义JSON

2024-05-19 13:09:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试将不需要的JSON输出转换为对我更有价值的格式。答案应该使用jq或Python代码(我使用Python中的pyjq库)

以下是当前的JSON输出:

[
 {"colour":"Red", "car": [ {"year":2000, "make":"Honda", "model":"Accord"} ] },
 {"colour":"Blue", "car": [ {"year":2015, "make":"Toyota", "model":"Camry"} ] },
 {"colour":"Red", "car": [ {"year":1999, "make":"Dodge", "model":"Ram"} ] }
]

使用jq或可能使用Python循环,我想将其格式化为一个新的JSON对象,如下所示:

[
 { "Red":[2000,1999] },
 { "Blue": 2015 }
]

有人知道我如何格式化任何类似于上面第一个代码段的JSON,并将其转换为第二个代码段中列出的所需结果吗。你知道吗


Tags: 答案代码jsonmakemodel代码段格式blue
3条回答

如果你在数据中循环,你可以修改一个新的dict,比如:

代码:

output = {}
for datum in data:
    for car in datum['car']:
        output.setdefault(datum['colour'], []).append(car['year'])

测试代码:

data = [
    {"colour": "Red",
     "car": [{"year": 2000, "make": "Honda", "model": "Accord"}]},
    {"colour": "Blue",
     "car": [{"year": 2015, "make": "Toyota", "model": "Camry"}]},
    {"colour": "Red",
     "car": [{"year": 1999, "make": "Dodge", "model": "Ram"}]}
]

output = {}
for datum in data:
    for car in datum['car']:
        output.setdefault(datum['colour'], []).append(car['year'])
print(output)

结果:

{'Red': [2000, 1999], 'Blue': [2015]}

group_by涉及排序,因此对于手头的问题来说效率不高。下面是使用jq的直接方法。它类似于本页其他地方提供的python解决方案:

 reduce .[] as $car ({};
   .[ $car.colour ] += ($car.car | map(.year)) )
 | map_values(if length==1 then .[0] else . end)
 | [ to_entries[] | {(.key): .value} ]

map_values开头的行用于满足避免单例数组的要求。如果结果字典可以接受,最后一行可以省略。你知道吗

注意,即使.car数组有多个元素,上面的程序也可以工作。你知道吗

jq非常适合这个。让我们看看它能做什么。首先,让我们把汽车按颜色分组。group_by()接受一个数组,并按所需的子表达式对元素进行分组。你知道吗

$ jq 'group_by(.colour)' input.json
[
    [
        {"car":[{"model":"Camry","make":"Toyota","year":2015}],"colour":"Blue"}
    ],
    [
        {"car":[{"model":"Accord","make":"Honda","year":2000}],"colour":"Red"},
        {"car":[{"model":"Ram",   "make":"Dodge","year":1999}],"colour":"Red"}
    ]
]

然后让我们将每个子数组映射到一个{color: [years]}对象。map()函数接受一个数组,并将每个输入元素更改为一些新的输出元素。我们可以用它来创建我们想要的{color: [years]}对象。你知道吗

让我们从部分映射开始。我们把颜色拿出来看看是什么样子。你知道吗

$ jq -c 'group_by(.colour) | map({(.[0].colour): []})' input.json
[{"Blue":[]},{"Red":[]}]

太好了。我们有颜色。现在要得到我们再次使用map的年份列表,将cars的子数组转换成年份数组。你知道吗

$ jq -c 'group_by(.colour) | map({(.[0].colour): map(.car[].year)})' input.json
[{"Blue":[2015]},{"Red":[2000,1999]}]

相关问题 更多 >