Извлечь значение определенного ключа из файла JSON

Извлечь значение определенного ключа из файла JSON

У меня есть огромный 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": "[email protected]",
  "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": "[email protected]",
      "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": []
}

Я хочу извлечь все адреса электронной почты из файла JSON, по сути, user@domainэто EmailAddress: "user@domain"выглядит так:

[email protected]
[email protected]

решение1

С использованиемjq, правильный инструмент для анализа JSON:

$ jq -r '..|.EmailAddress? //empty' infile.json
[email protected]
[email protected]

попробуйте онлайн:https://jqplay.org/s/yjkKkCxecg


изруководство jq:

--raw-output / -r:
При использовании этой опции, если результатом фильтра является строка, то она будет записана непосредственно в стандартный вывод, а не отформатирована как строка JSON с кавычками.

Рекурсивный спуск:..
Рекурсивно спускается ., производя каждое значение.
[...]
В этом примере мы использовали ..|.foo?поиск всех значений ключей объектов "foo" в любом объекте, найденном "ниже" ..

Необязательный индекс идентификатора объекта:.foo?
Точно так же, как .foo, но не выводит даже ошибку, если .не является массивом или объектом.

Альтернативный оператор: //
Фильтр формы a // bдает те же результаты, что и a, если aдает результаты, отличные от falseи null. В противном случае a // bдает те же результаты, что и b.

Это полезно для предоставления значений по умолчанию: .foo // 1будет оцениваться как , если во входных данных 1нет элемента..foo

empty
emptyне возвращает никаких результатов. Вообще никаких. Даже нет null.

Связанный контент