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"
}
]
我有这样的无效 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"
}
]