如何使用 jtc 在 json 文件中 find/replace?

how to find/replace in a json file using jtc?

我有下面的文件。使用 jtc 如何用 "value": {"$numberDecimal":"1234.56"} 替换所有出现的 "value": 1234.56;也就是说,包装数字。这是针对 mongoimport,我想要求将值导入为小数而不是浮点数。

或者使用 jq 可能有更好的解决方案?

示例文件:

{
  "data": {
    "slice": [
      {
        "source": {
          "id": "foo"
        },
        "value": 1.0
      },
      {
        "source": {
          "id": "bar"
        },
        "value": 2.0
      }
    ]
  }
}

如果我对问题的理解正确,那么使用最新的 jtc 版本你可以这样做:

bash $ <file.json jtc -w'[value]:<>N:' -u'{"$numberDecimal":"{}"};' -tc
{
   "data": {
      "slice": [
         {
            "source": { "id": "foo" },
            "value": { "$numberDecimal": "1.0" }
         },
         {
            "source": { "id": "bar" },
            "value": { "$numberDecimal": "2.0" }
         }
      ]
   }
}
bash $ 

如果您想进行就地文件修改,请使用 -f:

bash $ jtc -w'[value]:<>N:' -u'{"$numberDecimal":"{}"};' -f file.json

以下 jq 程序会将数字转换为 JSON 形式的对象 {"$numberDecimal": <STRING>}:

walk(if type == "number" then {"$numberDecimal": tostring} else . end)

如果您不介意 1.0 变为“1”,那么上述内容将适用于具有 walk 的任何版本的 jq,假设不转换为 IEEE 754 数字提出任何问题。

否则,最简单的选择可能是升级到当前 master 版本的 jq(> 1.6),因为此版本应保留精度。