使用 JQ 展平嵌套的 Json 对象

Posted

技术标签:

【中文标题】使用 JQ 展平嵌套的 Json 对象【英文标题】:Flatten nested Json objects with JQ 【发布时间】:2019-01-26 05:50:47 【问题描述】:

我正在创建一个脚本来将 JSON 对象转换为“字符串”文件(用于翻译目的)。这个想法是转变:


   "TRANSLATION1": "text1",
   "TRANSLATION2": "text2"

进入

"TRANSLATION1" = "text1";
"TRANSLATION2" = "text2";

这是通过以下方式完成的: jq -r 'to_entries|map("\"\(.key)\"=\(.value|tojson);")|.[]'

不错!

现在,我的问题在于嵌套对象:


   "TRANSLATION1": "text1",
   "TRANSLATION2": "text2",
   "TRANSLATION3": 
     "SUBTRANS1": "subtranslation1",
     "SUBTRANS2": "subtranslation2",
   

我想得到这样的结果:

"TRANSLATION1" = "text1";
"TRANSLATION2" = "text2";
"TRANSLATION3.SUBTRANS1" = "subtranslation1";
"TRANSLATION3.SUBTRANS2" = "subtranslation2";

谁能帮忙?!我已经挠头好几个小时了……

【问题讨论】:

【参考方案1】:

一种方法是使用tostream

tostream
| select(length==2)
| (.[0] | join(".")) as $k
| .[1] as $v
| "\"\($k)\" = \"\($v)\";"

当与 -r 命令行选项一起使用时,这将产生所需的结果,假设输入是有效的 JSON。

检查关键假设 [*]

可能值得明确指出,如果任何键名包含句点,则输出格式可能不是很有用,因此可能值得检查是否确实如此,例如如下:

[.. | objects | keys_unsorted[]]
| map(select(index(".")))
| unique[]

如果你的jq没有tostream

paths as $path
| getpath($path) 
| strings
| "\"\($path|join("."))\" = \"\(.)\";"

[*] 双关语

【讨论】:

哈哈哈......很高兴在这个网站上看到一些笑话......我想念它:) 非常感谢,它非常有用。仅供参考,JSON 对象的格式都很好,并且没有带有 '.' 的键 现在我需要做相反的事情,将“字符串格式转换为 JSON”,并重新创建对象。如果我不成功,我会 ping 你。再次感谢。

以上是关于使用 JQ 展平嵌套的 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

使用 jq 保留键名展平 JSON

使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象

展平/取消展平嵌套 JSON 对象的最快方法

展平嵌套的 JSON 对象

使用 Jq 展平 JSON,并在输出中使用数组索引