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

标签 json merge jq

我有多个 JSON 风格的文本文件需要合并:

{
  "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]
    ]
  }
}

City1City2 等可能会扩展到数十个,每个都有不同数量的坐标。

我知道这些文件不是正确的 JSON,但是当我通过 to_entries 传递文件以将 "CityN" 更正为 "key":"CityN ",那么 "Coords" 就更深了,无论如何,我尝试对 to_entries 的结果所做的几乎所有操作都会返回 Cannot带有字符串“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]
    ]
  }
}

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

最佳答案

以下解决方案既不优雅也不健壮,但至少它很简单并且可以轻松增强。它假定每个文件有一个对象,并且使用 -s 选项调用 jq。

# 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 input 可能会更好>,并使用 -n 选项而不是 -s 调用 jq。这种方法的优点之一是它消除了每个文件一个对象的要求。

关于json - 如何在格式不良的 JSON 中对列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62704574/

相关文章:

javascript - 用 "\\"写 JSON

python - 在python中验证字符串是否为JSON?

php - PHP/Codeigniter/jQuery/MySQL 的最佳数据访问方法

javascript - 在 Backbone 应用程序中使用时焦点+上下文图中的解析错误

svn - 使用 git-svn(或类似的)*just* 来帮助进行 svn 合并?

json - 使用 jq 将 json 转换为 csv,数组嵌套在数组中

当前分支和 master 之间的 Git diff 但不包括未 merge 的 master 提交

r - 是否有一个 R 函数可以根据分别匹配同一列的两列来合并两个数据框?

arrays - 如何使用 jq 将字符串数组转换为对象?

json - 使用 jq 将结构化 JSON 转为 CSV