Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在格式不佳的JSON中对列表进行分组_Json_Merge_Jq - Fatal编程技术网

如何在格式不佳的JSON中对列表进行分组

如何在格式不佳的JSON中对列表进行分组,json,merge,jq,Json,Merge,Jq,我有多个JSON ish文本文件需要合并: { "City1": { "Coords": [ [10,20,30], [11,21,31] ] }, "City2": { "Coords": [ [12,22,32] ] } } { "City1": { "Coor

我有多个JSON ish文本文件需要合并:

{
  "City1":
  {
    "Coords":
    [
      [10,20,30],
      [11,21,31]
    ]
  },
  "City2":
  {
    "Coords":
    [
      [12,22,32]
    ]
  }
}
{
  "City1":
  {
    "Coords":
    [
      [13,23,33]
    ]
  },
  "City3":
  {
    "Coords":
    [
      [14,24,34],
      [15,25,35]
    ]
  }
}
City1
City2
等可以扩展到几十个,每个都有不同数量的坐标

我知道这些文件不是正确的JSON,但是,当我通过
传递文件到_条目
以更正
“CityN”
“key”:“CityN”
,那么
“Coords”
是一个更深的层次,在任何情况下,我尝试对
to\u条目的结果执行的几乎所有操作都返回
无法使用字符串“key”
索引数组

我想回去

{
  "City1":
  {
    "Coords":
    [
      [10,20,30],
      [11,21,31],
      [13,23,33]
    ]
  },
  "City2":
  {
    "Coords":
    [
      [12,22,32]
    ]
  },
  "City3":
  {
    "Coords":
    [
      [14,24,34],
      [15,25,35]
    ]
  }
}

但是我不知道怎么做。非常感谢您的帮助。

下面的解决方案既不优雅也不健壮,但至少它很简单,可以很容易地进行健壮化。它假定每个文件有一个对象,并且jq是通过-s选项调用的

# merge two same-key objects with array-valued keys
# by concatenating the arrays
def merge($b):
  if . == null or . == {} then $b
  else reduce (keys_unsorted[]) as $key (.;
    .[$key] += ($b[$key]) )
  end;

reduce .[] as $cities (null;
   reduce ($cities|keys_unsorted[]) as $city (.;
     .[$city] |= merge($cities[$city]) ))

如果jq有
输入
(可能是这样),那么最好将
reduce.
更改为
reduce输入
,并使用
-n
选项而不是
-s
调用jq。这种方法的一个优点是,它删除了每个文件一个对象的要求。

以下方法有效:

jq -s 'map(to_entries)|flatten|group_by(.key)|
    map( { (.[0].key): { "Coords": (reduce .[].value.Coords as $i ([]; . + $i))}} )'

为了
jq
的目的,您的输入是一个正确的JSON对象流
jq
可以处理这种输入。我使用
-s
选项将流转换为JSON数组。

reduce.[]
更改为
reduce输入,并作为
jq-nf merge.jq…