Json搜索和打印

时间:2016-07-27 04:34:00

标签: json jq

我一直在尝试使用jq解析器来帮助我从json文件中提取信息。

以下是一个示例代码段

{
  "main_attribute": {
    "name": {
      "display_name": "abc"
    },
    "address": {
      "unit": "1",
      "street": "Dundas",
      "suburb": "Syd",
      "state": "NSW"
    },
    "financial_debt": {
      "bank_loan": true
    }
  },
  "secondary_attr": {
    "income": {
      "pretax": 100000
    },
    "automobile": {
      "make": "Citroen",
      "model": 2015,
      "new": true
    },
    "property": {
      "property_owned": 1,
      "owned_since": 2000,
      "first_sale": true
    },
    "education": {
      "degree": "MS",
      "graduated": 1990,
      "financial_debt": {
        "bank_loan": false
      }
    }      
  }
}

我需要找到“financial_debt”为真的块。该字段可以是main_attribute(作为全局值),也可以是辅助属性。

预期产出:

financial_debt:关于“汽车”和“财产”的bank_loan

你能告诉我如何使用jq进行搜索吗?

2 个答案:

答案 0 :(得分:1)

这绝不是最有效的方法,但它是有效的。它返回一个布尔值,指定true属性下是否有financial_debt布尔值。

jq '[recurse | .financial_debt? | select(. != null) | recurse | booleans] | any'

答案 1 :(得分:0)

tostream 可用于查找包含"financial_debt"的路径,如下所示:

  tostream
| select(length==2)
| select(.[0] | contains(["financial_debt"]))

filter.jq中的此过滤器和data.json

中的数据
$ jq -M -c -f filter.jq data.json

产生

[["main_attribute","financial_debt","bank_loan"],true]
[["secondary_attr","education","financial_debt","bank_loan"],false]

此中间结果可与 reduce setpath getpath 以及

等过滤器一起使用
  . as $d
| reduce ( tostream
         | select(length==2)
         | select(.[0] | contains(["financial_debt"]))) as [$p,$v] (
    {}
  ; setpath($p[:-1]; $d | getpath($p[:-1]))
  )

生产

{
  "main_attribute": {
    "financial_debt": {
      "bank_loan": true
    }
  },
  "secondary_attr": {
    "education": {
      "financial_debt": {
        "bank_loan": false
      }
    }
  }
}