Javascript 如何使用jq将JSON格式化为嵌入的、转义的/字符串化的JSON(对于任何/所有结构)?

Javascript 如何使用jq将JSON格式化为嵌入的、转义的/字符串化的JSON(对于任何/所有结构)?,javascript,json,jq,Javascript,Json,Jq,有很多问题会说“我有这个精确的JSON结构,请帮我做功课,让它有另一个精确的结构。”这不是这些问题中的一个 我想看看清理通用数据的jq脚本。我将在下面发布一个答案,这个答案对于我从日志中获得的大多数数据都非常有效。但是,鉴于这里有很多聪明人,我想看看其他人有什么想法 注意:这不是其他问题的重复,因为我在上面看到的每个问题的性质都会导致答案几乎只对OP有用。这个问题的答案应该对每个在谷歌上搜索类似问题的人都有帮助。一些幸运的回答者会得到一个声誉炸弹。假设所有嵌入的JSON都是一个小型字典(就像我的

有很多问题会说“我有这个精确的JSON结构,请帮我做功课,让它有另一个精确的结构。”这不是这些问题中的一个

我想看看清理通用数据的
jq
脚本。我将在下面发布一个答案,这个答案对于我从日志中获得的大多数数据都非常有效。但是,鉴于这里有很多聪明人,我想看看其他人有什么想法


注意:这不是其他问题的重复,因为我在上面看到的每个问题的性质都会导致答案几乎只对OP有用。这个问题的答案应该对每个在谷歌上搜索类似问题的人都有帮助。一些幸运的回答者会得到一个声誉炸弹。

假设所有嵌入的JSON都是一个小型字典(就像我的Terraform输出、AWS cli输出和AWS日志一样),这一个
jq
脚本效果非常好

jq 'walk(if type == "string" and .[0:2] == "{\"" then .=(.|fromjson) else . end)'
它的工作原理是遍历json对象,查找以
{“
开头的字符串,并使用子进程将它们从json导入
(永远不要离开
jq

我将它放在bash函数(
jqp
)中,因为它比为别名转义引号更容易,而且更灵活。然后我可以使用它处理文件或剪贴板内容

# This is in my .bash_profile
jqp(){
  jq 'walk(if type == "string" and .[0:2] == "{\"" then .=(.|fromjson) else . end)' "$@"
}

可以在所有字符串上运行
fromjson
,例如使用
walk

walk(if type == "string" then fromjson? // . else . end)
不使用数字字符串
“清理通用数据”相当广泛,至少对于不熟悉您日志的人来说是这样。即使您有一个通用问题,遵循指导原则仍然是一个好主意。如果我唯一的指导是“清理通用数据”",这太宽泛了。但我用JSON-specific将问题命名为JSON,并给出了一个示例。我想泛型的部分是源代码的结构,而不是要纠正的问题。mcve通常包含在Q中,而不是A中。A中的示例并不是很小,我觉得它不是很有启发性的e,g,w.r.t
tostring
数组表示法。@peak很抱歉,你觉得这不是很有趣或很有启发性,但我觉得你的答案非常有启发性。它比你的答案更有用,你的答案也可以用你在这里给出的答案来解决。这就是我不想给出数据结构的原因在问题中,这是相当有效的。它确实有一个不幸的副作用,将
“EventVersion”:“1.0”
转换为
“EventVersion”:1.0
,来自我的示例JSON,但我非常喜欢它,因为“我需要能够阅读这个小混乱”工具。感谢您的贡献。如果您不想将数字字符串转换为数字,那么您可以通过使用
tonumber?
test
和合适的正则表达式轻松避免这种情况。哇!这个答案对我来说是一个很好的学习经验,我只是想理解它。今天之前,我甚至从未在
中使用过函数jq
。现在我正试着了解
/
,不要与
?/
混淆。请注意,
=(.| fromjson)
可以简化为
fromjson
:-!
walk(if type == "string" then fromjson? // . else . end)
walk(if type == "string"
     then if tonumber? // false then . 
          else fromjson? // . end
     else . end)