首页 > 解决方案 > 修改一个比较两个json的值

问题描述

我有一个 JSON 数据,它是一个字典数组,语法如下:

文件 1.json

[ 
     {

    "Date_and_Time": "Dec 29, 2017 15:35:37",
    "Componente": "Bar",
    "Country": "Brazil",
    "Age": "3"

},

{

    "Date_and_Time": "Dec 31, 2017 17:35:37",
    "Componente": "Foo",
    "Country": "France",
     "Id": "123456",
     "Car": "Ferrari"

}

]

我还有另一个语法相似的 JSON 数据,除了Date_and_Time的字段。

文件2.json

[ 
{
  "Date_and_Time": "Dec 31, 2017 17:35:37",
    "Age": "1",
    "Country": "France",
     "Id": "123456",
     "Car": "Ferrari"
},
{
    "Date_and_Time": "Mar 31, 2018 14:35:37",
    "Componente": "Foo",
    "Country": "Germany",
     "Id": "2468",
     "Genre": "Male"

}
]

两个 JSON 数据具有相同数量的 Date_and_Time 字段。我想要做的是仅将第一个json的值重写为Date_and_Time的第二个json的值

预期输出:file3.json

[ 
     {

    "Date_and_Time": "Dec 31, 2017 17:35:37",
    "Componente": "Bar",
    "Country": "Brazil",
    "Age": "3"

},

{

    "Date_and_Time": "Mar 31, 2018 14:35:37",
    "Componente": "Foo",
    "Country": "France",
     "Id": "123456",
     "Car": "Ferrari"

}

]

只要它有效,我对使用什么没有偏好。我曾考虑过使用 jq ,但由于以下原因它不起作用:

jq -n --argjson oldvals "$(< file1.json)" --argjson newvals "$(< file2.json)" '    reduce range($oldvals | length) as $idx      ($oldvals; .[$idx].Date_and_Time = $newvals[$idx].Date_and_Time)' > file3.json

它收到了下一条消息

/usr/bin/jq: the list of argument is too long

标签: javascriptpythonjsonjq

解决方案


在他的许可下,这是@oguzismail 的绝佳答案:

jq '
  input as $in
  | reduce range(length) as $i (.;
      .[$i].Date_and_Time = $in[$i].Date_and_Time)
' f1 f2 

重要的一点是 -s slurp 命令行选项可以很容易地避免,因为如果考虑到效率,它应该尽可能地避免。

然而,上面的公式有点微妙,因为它取决于一个不太明显的事实,即当input在没有 -n 命令行选项的情况下使用时,它评估为作为输入呈现的第二个JSON 实体。在本例中,这将是 f2 中的 JSON 实体;.相比之下,顶层计算为 f1 中的 JSON 实体。

所以这里有一个替代方案,也许更直观地展示了几乎相同的程序:

jq -n '
  input as $f2
  | input
  | reduce range(length) as $i (.;
      .[$i].Date_and_Time = $f2[$i].Date_and_Time)
' f2 f1 

推荐阅读