如何使用jq从内联字符串读取数据而非标准输入?
直接用jq读取字符串中JSON数据的实用方法
嘿,这个需求我太熟了!其实不用绕弯子,jq本身就支持直接处理字符串形式的JSON,我给你分享两种好用的方法,完美实现你想要的类似jq '.field' "$my_json"的调用体验:
方法1:用--argjson参数(推荐,逻辑更清晰)
jq专门提供了--argjson参数来传递JSON格式的字符串,它会自动把传入的字符串解析成jq能识别的JSON对象,用法非常直观:
假设你的JSON字符串变量是这样的:
my_json='{"field": "hello jq", "nested": {"id": 123}}'
你可以直接这样调用jq:
jq '.field' --argjson input "$my_json" '$input'
如果要读取嵌套字段,比如.nested.id,只需要调整jq的查询表达式即可:
jq '.nested.id' --argjson input "$my_json" '$input'
原理很简单:--argjson input "$my_json"会把$my_json里的JSON字符串解析成jq内部的$input变量,后面的$input就是在jq表达式里引用这个变量,之后就可以正常查询任意字段了。
方法2:用Shell的Here String(兼容性更好)
如果你的jq版本比较旧(比如低于1.5),不支持--argjson,可以用Shell的Here String特性,它能直接把字符串当作标准输入传给jq,写法更简洁:
jq '.field' <<< "$my_json"
这个效果和echo "$my_json" | jq '.field'完全一致,但写法更紧凑,看起来就像是直接把字符串“喂”给jq一样。
为啥直接jq '.field' "$my_json"不行?
顺便解释下,jq默认会把第一个非选项参数当作文件名处理,直接传"$my_json"的话,jq会去寻找一个名字等于这个JSON字符串内容的文件,自然会报错“找不到文件”,所以必须用上面两种方法明确告诉jq:这是JSON内容,不是文件名。
内容的提问来源于stack exchange,提问作者user5047085
相关产品推荐
相关产品推荐

