使用 JQ 展平嵌套 Json 个对象
Flatten nested Json objects with JQ
我正在创建一个脚本来将 JSON 对象转换为 "string" 文件(用于翻译目的)。想法是转换:
{
"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";
有人能帮忙吗?!我已经挠头好几个小时了...
一种方法是使用 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 对象转换为 "string" 文件(用于翻译目的)。想法是转换:
{
"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";
有人能帮忙吗?!我已经挠头好几个小时了...
一种方法是使用 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("."))\" = \"\(.)\";"
[*] 双关语