如何用jq通用美化打印含嵌套JSON字符串的任意键,无需指定键名?
问题
需要用jq工具美化打印包含嵌套JSON字符串的JSON数据,示例输入如下:
echo '{ "my_key": "my_val", "next_key": "next_val", "schema": "{\n \"name\": \"bucket_name\"\n}" }'
期望输出:
{ "my_key": "my_val", "next_key": "next_val", "schema": { "name": "bucket_name" } }
当前方法需要硬编码指定键名(比如schema),还得修改原输入的转义字符,命令如下:
echo '{ "my_key": "my_val", "next_key": "next_val", "schema": "{\\n \\"name\\\": \\"bucket_name\\\"\\n}" }' | jq '(.schema | fromjson) as $s | .schema = $s'
想找一种通用方法:无需指定键名、无需修改原输入JSON,自动识别所有值为JSON字符串的键并解析,实现整体美化打印。
通用解决方案
可以用jq的递归遍历和条件判断实现自动解析所有嵌套的JSON字符串值,原理是遍历每个元素,尝试解析字符串为JSON,成功就替换,失败则保留原值。
直接可用的命令
拿原输入直接执行这条命令就行:
echo '{ "my_key": "my_val", "next_key": "next_val", "schema": "{\n \"name\": \"bucket_name\"\n}" }' | jq 'walk(if type == "string" then try fromjson catch . else . end)'
命令说明
walk(f):递归遍历JSON的每一个元素,对每个元素执行函数f- 条件判断部分:
- 先判断当前元素是不是字符串类型
- 如果是,尝试用
fromjson解析成JSON对象/数组,解析成功就用解析后的值替换原字符串 - 如果解析失败(比如就是普通文本字符串),就保留原字符串不变
效果
执行后会自动识别所有值为合法JSON的字符串字段并解析,同时保留普通字符串,输出就是你想要的美化后的完整JSON。
内容的提问来源于stack exchange,提问作者Liam Caffrey
相关产品推荐
相关产品推荐

