首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据嵌套值的条件解析json并提取数组中的项

根据嵌套值的条件解析json并提取数组中的项
EN

Stack Overflow用户
提问于 2015-07-21 21:24:25
回答 4查看 1.4K关注 0票数 1

我已经在这里问了一个类似的问题- Parse json and choose items\keys upon condition,但这次略有不同。

示例如下:

代码语言:javascript
运行
复制
[
  {
    "item1": "value123",
    "array0": [
      {
        "item2": "aaa"
      }
    ]
  },
  {
    "item1": "value456",
    "array1": [
      {
        "item2": "bbb"
      }
    ]
  },
  {
    "item1": "value789",
    "array2": [
      {
        "item2": "ccc"
      }
    ]
  }
]

我想要得到"item1“的值,只有当"item2”有一个特定值的时候。

假设item2等于"bbb",那么我想要返回的只有"value456“。

我试着用jq来解决这个问题,就像我在上面提到的问题中那样,但没有用,因为我不能从比我用jq的select和map搜索的值更高的级别提取值。

EN

回答 4

Stack Overflow用户

发布于 2015-07-21 23:03:25

多亏了递归运算符..的魔力,才有了一个更简单的解决方案

jq -r '.[] | select(.. | .item2? == "bbb").item1'

基本上,对于原始数组中的每个(.[])对象,只选择(select)那些递归(..)名为.item2等于"bbb"的键,然后选择所述对象的.item1属性。

票数 3
EN

Stack Overflow用户

发布于 2015-07-21 22:13:47

在jq的手册中找到了解决方案(使用#ifthenelse和#Objects) -- http://stedolan.github.io/jq/manual

代码语言:javascript
运行
复制
jq -r '{name1: .[].item1, name2: .[].array[].item2} | /
if .item2 == "bbb" then .name1 elif .item2 != "bbb" then empty else empty end'
票数 0
EN

Stack Overflow用户

发布于 2015-07-22 10:01:14

如果你发现..的魔力。对于您的目的来说,功能太强大了,以下内容可能会有用。它限制搜索"item2“键。

代码语言:javascript
运行
复制
def some(condition): reduce .[] as $x
 (false; if . then . else $x|condition end);

.[]
| to_entries
| select( some( .value | (type == "array") and some(.item2 == "bbb")) )
| from_entries
| .item1

如果您的jq有任何/1,则使用它而不是某些/1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31540337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档