【问题标题】:How to get entire parent node using jq json parser?如何使用 jq json 解析器获取整个父节点?
【发布时间】:2019-03-02 03:02:07
【问题描述】:

我试图在 json 文件中找到一个值,并基于此我需要获取整个 json 数据而不是那个特定的块。

这是我的示例 json

[{
      "name" : "Redirect to Website 1",

      "behaviors" : [ {
        "name" : "redirect",
        "options" : {
          "mobileDefaultChoice" : "DEFAULT",
          "destinationProtocol" : "HTTPS",
          "destinationHostname" : "SAME_AS_REQUEST",
          "responseCode" : 302
        }
      } ],
      "criteria" : [ {
        "name" : "requestProtocol",
        "options" : {
          "value" : "HTTP"
        }
      } ],
      "criteriaMustSatisfy" : "all"
},
{
      "name" : "Redirect to Website 2",

      "behaviors" : [ {
        "name" : "redirect",
        "options" : {
          "mobileDefaultChoice" : "DEFAULT",
          "destinationProtocol" : "HTTPS",
          "destinationHostname" : "SAME_AS_REQUEST",
          "responseCode" : 301
        }
      } ],
      "criteria" : [ {
        "name" : "contentType",
        "options" : {
          "matchOperator" : "IS_ONE_OF",
          "values" : [ "text/html*", "text/css*", "application/x-javascript*" ],
        }
      } ],
      "criteriaMustSatisfy" : "all"
}]

我正在尝试在每个 behaviors 数组中匹配 "name" : "redirect",如果匹配,那么我需要包括“条件”部分在内的整个块,因为您可以在同一块 {} 下看到它

我设法使用选择方法找到了值,但无法获取父部分。

https://jqplay.org/s/BWJwVdO3Zv

非常感谢任何帮助!

【问题讨论】:

  • 对于给定的示例,包括“标准”部分的整个块会选择所有内容,对吗?如果没有,请使用预期输出更新您的问题。
  • @oliv 使用当前设置我无法过滤它。它正在返回整个 json 文件。

标签: json object parent jq


【解决方案1】:

为避免不必要的重复:

.[]
| first(select(.behaviors[].name == "redirect"))

等价:

.[]
| select(any(.behaviors[]; .name == "redirect"))

【讨论】:

  • 嗨,谢谢伙计!它运作良好。你能告诉我首先在这里做什么吗?
  • 如果 s 是一个非空流,first(s) 发出流中的第一项。如果 s 为空,则 first(s) 为空流。
  • 哦,我明白了。使用您的选择方法,我试图简化。 jqplay.org/s/VW44dDfmdZ 所以现在不使用“first”我得到了整个 json 元素。我们真的需要先使用吗?对不起,如果我错了。
  • 它可以避免不必要的重复。如果您确定您的 JSON 永远不会有多个名为“redirect”的“行为”(在同一个顶级对象中),那么请务必省略它。
  • 哦,是的。有道理。实际上我的 json 文件会有多个“重定向”规则,我想全部捕获。
【解决方案2】:

你可以试试这个 jq 命令:

 <file jq 'select(.[].behaviors[].name=="redirect")'

【讨论】:

  • 您好,感谢您帮助我。但是,不幸的是,无论情况如何,我都看到了所有的障碍。
  • @user3613331 如果您将redirect 字符串更改为其他任何内容,您将不会有任何输出。请使用上述命令失败的示例更新您的问题。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多