JSON 还无效时如何使用 JQ 转义 JSON 值中的引号

How to escape quotes in a JSON value with JQ when JSON is not valid yet

我有这样的无效 JSON:

{
   "a": "value1",
   "b": "value2",
   "c": "value3"
}
{
   "a": "value4",
   "b": "value5",
   "c": "value6"
}
{
   "a": "value7",
   "b": "value8",
   "c": "value9"
}

我可以轻松地使用 JQ 使它有效 -- jq . -s -- 输出:

[
   {
       "a": "value1",
       "b": "value2",
       "c": "value3"
   },
   {
       "a": "value4",
       "b": "value5",
       "c": "value6"
   },
   {
       "a": "value7",
       "b": "value8",
       "c": "value9"
   }
]

但是当我的无效 JSON 包含引号时...

{
   "a": "value1",
   "b": "value with "quotes"2",
   "c": "value with "more" than one set of "quotes"3"
}
{
   "a": "value4",
   "b": "value with "quotes"5",
   "c": "value with "more" than one set of "quotes"6"
}
{
   "a": "value7",
   "b": "value with "quotes"8",
   "c": "value with "more" than one set of "quotes"9"
}

...由于引号中的引号,JQ 命令显然不起作用。

我的目标是使我的原始 JSON 在 (1) 结构和 (2) 值中的引号转义中完全有效。除了值内的引号外,我不想转义任何其他引号——例如:

"c": "value with \"more\" than one set of \"quotes\"9",

我已经编写了许多一次性 Bash sed 脚本来搜索和用转义引号替换未转义引号,但是随着用例的增加,脚本的数量也在增加。如果我知道如何更好地使用 JQ,似乎 JQ 可能足够强大和优雅来处理这样的用例。

我尝试了 JQ 的 slurp、原始输入和原始输出函数的各种组合。我所做的就是在逃脱的一切或我原来的问题 JSON 之间来回切换。 c 是唯一一个其值中包含引号的键。

除了 sed 或 JQ 之外,可能还有另一种解决方案可以明智地解决这个问题。命令行解决方案是理想的,因为我不知道 C#、Java 或 JavaScript。 Python 如果根本无法使用 JQ 完成它,可能是可以接受的。

感谢您的任何帮助或想法。

sed + jq 解法:

sed -E 's/"/\&/4g; s/\"(,)?$/"/' input.json | jq -s '.'

输出:

[
  {
    "a": "value1",
    "b": "value with \"quotes\"2",
    "c": "value with \"more\" than one set of \"quotes\"3"
  },
  {
    "a": "value4",
    "b": "value with \"quotes\"5",
    "c": "value with \"more\" than one set of \"quotes\"6"
  },
  {
    "a": "value7",
    "b": "value with \"quotes\"8",
    "c": "value with \"more\" than one set of \"quotes\"9"
  }
]