2017-04-14 70 views
1

我有两个以下的json文件。合并每个子对象的数组

file1.json

{"field1":{"item1":0,"array1":[0,0,0],"array2":[0,0],"array3":[0]},"field2":{"dummy":0}} 

file2.json

{"field1":{"item1":1,"array1":[1,1,1],"array2":[1,1],"array3":[1]},"field2":{"dummy":0}} 

我想获得此:

{"field1":{"item1":0,"array1":[0,0,0,1,1,1],"array2":[0,0,1,1],"array3":[0,1]},"field2":{"dummy":0}} 

我能够通过数组做手工数组,但我会更喜欢一种方法来为每个field1数组自动执行它。有人为我提供小费吗?

非常感谢您的帮助!

回答

1

以下内容假定file1.json和file2.json包含有效的JSON。您可以准用JSON JQ运行转换成JSON:jq -n -f fileN.json

def extend_arrays(o): 
    reduce keys[] as $k 
    (.; if (.[$k]|type) == "array" and (o[$k]|type == "array") 
     then .[$k] += o[$k] else . end); 

.field1 |= extend_arrays($second|.field1) 

与文件program.jq这些线路,调用:

jq -c --argfile second file2.json -f program.jq file1.json 

产生所需的输出:

{"field1":{"item1":0,"array1":[0,0,0,1,1,1],"array2":[0,0,1,1],"array3":[0,1]},"field2":{"dummy":0}} 
+0

非常感谢,它的工作原理。但是,对于未来的读者,program.jq必须在一行。所以,每一个program.jq换行都必须被删除。 – vadetech1311

+0

情况并非如此。通常情况下,您可以将该程序放入名为program.jq的文件中,该文件可以包含新行。 – peak

+0

我在论坛上看到其他人对我有多线程程序。也许它来自我使用的版本(jq 1.4)。在任何情况下,只需删除新行就可以工作,所以再次感谢! – vadetech1311