从 JSON 文件中提取特定键的值

Tho*_*s L 2 text-processing json jq

我有一个巨大的 JSON,看起来像这样。样本

{
  "Key": "4fa21496-3534-4480-8405-a0f7699a915e",
  "FirstName": "XX",
  "XX": "Liggins",
  "City": "Dallas",
  "RegionCode": "TX",
  "RegionName": "Texas",
  "Country": "United States",
  "Latitude": "32.783060",
  "Longitude": "-96.806670",
  "TimeZone": "America/Chicago",
  "IsCASL": false,
  "Updated": "2018-02-28T07:32:28",
  "HQCompanyName": "IHOP",
  "Position": "Server",
  "Level": "General",
  "Department1": "General",
  "DecisionMaker": false,
  "EmailAddress": "YYY@gmail.com",
  "EmailValidationStatus": "AcceptAll",
  "EmailValidationDate": "2018-02-10T03:02:07.1692141+00:00",
  "HQCompanyId": "XX2f37e171e26112cb",
  "Experience": [
    {
      "HQCompanyId": "XX2f37e171e26112cb",
      "Title": "Server",
      "Level": "General",
      "Department1": "General",
      "DecisionMaker": false,
      "Start": "2014",
      "End": "2015",
      "EmailAddress": "XXX@gmail.com",
      "SecondaryCompanyId": "10407780-c062-40c9-8783-110aa931a9c5",
      "Updated": "2018-08-31T23:52:31.663147Z"
    },
    {
      "HQCompanyId": "128ce753-6a72-4028-8a17-d76a1c53b22e",
      "Title": "XX",
      "Level": "General",
      "Department1": "General",
      "DecisionMaker": false,
      "Start": "May 2015",
      "End": "December 2015",
      "Duration": "7 months",
      "Updated": "2018-08-31T23:52:31.663147Z"
    }
  ],
  "Education": [
    {
      "Name": "XX",
      "Degree": "XX or equivalent",
      "Start": "2004",
      "End": "2008"
    }
  ],
  "SearchUrl": "https://www.google.com/#newwindow=1&q=XX+X",
  "SourceList": []
}
Run Code Online (Sandbox Code Playgroud)

我想从一个JSON文件中检索的所有电子邮件地址,基本user@domainEmailAddress: "user@domain",所以它看起来像这样,

YYY@gmail.com
XXX@gmail.com
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 14

使用jq,一个合适的 JSON 解析工具:

$ jq -r '..|.EmailAddress? //empty' infile.json
YYY@gmail.com
XXX@gmail.com
Run Code Online (Sandbox Code Playgroud)

在线试玩:https : //jqplay.org/s/yjkKkCxecg


jq 手册

--raw-output / -r:
使用此选项,如果过滤器的结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的 JSON 字符串。

递归下降:..
递归下降.,产生每个值。
[...]
在示例中,我们曾经..|.foo?在“下面”找到的任何对象中查找对象键“foo”的所有值.

可选的对象标识符-索引:.foo?
就像 一样.foo,但当.不是数组或对象时,甚至不输出错误。

替代运算符: //
形式的过滤器a // b产生与 相同的结果a, ifa产生除falseand之外的结果null。否则,a // b产生与 相同的结果b

这对于提供默认值很有用:如果输入中没有元素,.foo // 1将评估为。1.foo

empty
empty不返回任何结果。一个都没有。甚至没有null