使用jq解析数组JSON时未得预期结果,求技术指导
解决jq解析嵌套数组JSON的问题
嘿,我来帮你搞定这个jq解析的问题!先把你提供的JSON结构贴出来方便参考:
{ "id": "8a9o0laf3ff0", "displayId": "8a0a", "author": { "name": "Rahul", "emailAddress": "donotreply@mail.com" }, "authorTimestamp": 1524168139000, "message": "SD-90", "parents": [ { "id": "8c1679f0813c", "displayId": "8c0f", "author": { "name": "Sahotay", "emailAddress": "donotreply@mail.com" }, "authorTimestamp": 1523544887000, "message": "Fixing issues in SD-88", "parents": [ { "id": "..." } ] } ] }
这类嵌套parents数组的结构,核心是用jq的递归或者精准定位语法来处理,我给你几个常见场景的解决方案:
1. 提取所有层级的特定字段(比如所有message)
如果想把最外层和每一层parents里的message都捞出来,用递归遍历就很方便:
jq 'recurse(.parents[]?) | .message' your_json_file.json
执行后会输出:
"SD-90" "Fixing issues in SD-88"
recurse(.parents[]?)会自动遍历所有嵌套的parents数组元素,然后我们只取每个元素的message字段。
2. 提取特定层级的字段(比如第一层parents的作者信息)
如果只需要第一层parents里的作者姓名和邮箱,直接精准定位就行:
jq '.parents[] | .author' your_json_file.json
输出结果:
{ "name": "Sahotay", "emailAddress": "donotreply@mail.com" }
要是只想单独取姓名,改成.parents[] | .author.name就可以了。
3. 递归提取所有层级的ID
如果要把最外层和所有嵌套parents里的id都列出来:
jq 'recurse(.parents[]?) | .id' your_json_file.json
输出会是:
"8a9o0laf3ff0" "8c1679f0813c" "..."
4. 扁平化输出所有层级的完整对象
如果想把每个层级的完整对象都单独输出,方便后续处理:
jq 'recurse(.parents[]?)' your_json_file.json
这样会依次输出最外层对象、第一层parents对象、第二层parents对象(就是那个id为...的)。
如果你的需求更具体(比如只提取某几层、组合多个字段),可以调整上面的表达式就行!
内容的提问来源于stack exchange,提问作者Rahul Sahotay
相关产品推荐
相关产品推荐

