Как разобрать этот файл с помощью jq? - PullRequest
0 голосов
/ 13 сентября 2018

Я только начал использовать и файлы json, и я пытаюсь проанализировать определенный файл. Я пытаюсь сделать это с помощью jq в командной строке, но если есть какой-то другой способ сделать это правильно, я попробую.

Сам файл выглядит так:

{
  "Status": "ok",
  "Code": 200,
  "Message": "",
  "Result": [
    {
      "ID": 123456,
      "Activity": 27,
      "Name": Example1",
      "Coordinate": {
        "Galaxy": 1,
        "System": 22,
        "Position": 3
  },
      "Administrator": false,
      "Inactive": false,
      "Vacation": false,
      "HonorableTarget": false,
      "Debris": {
        "Metal": 0,
        "Crystal": 0,
        "RecyclersNeeded": 0
      },
      "Moon": null,
      "Player": {
        "ID": 111111,
        "Name": "foo",
        "Rank": 4
      },
      "Alliance": null
    },
    {
      "ID": 223344,
      "Activity": 17,
      "Name": "Example2",
      "Coordinate": {
            "Galaxy": 3,
            "System": 44,
            "Position": 5
          },
          "Administrator": false,
          "Inactive": false,
          "Vacation": false,
          "StrongPlayer": false,
          "HonorableTarget": false,
          "Debris": {
            "Metal": 0,
            "Crystal": 0,
            "RecyclersNeeded": 0
          },
          "Moon": null,
          "Player": {
            "ID": 765432,
            "Name": "Player 2",
            "Rank": 3
          },
          "Alliance": null
        },
  (...)
  ]
}

Мне нужно извлечь информацию, основанную на галактике / системе / положении. Например, наличие скрипта с соответствующими фильтрами и выполнение чего-то подобного:

./parser --galaxy=1 --system=22 --position=3

И это дало бы мне:

ID : 123456
Name : Example1
Activity : 27
...

Я пытался сделать это с помощью curl, чтобы захватить мой файл json, и jq, чтобы проанализировать мой файл, но я понятия не имею, как я могу сделать такой запрос.

1 Ответ

0 голосов
/ 13 сентября 2018

Следующего должно быть достаточно, чтобы вы пошли по вашему пути.

Во-первых, давайте предположим, что JSON находится в файле с именем galaxy.json;во-вторых, давайте предположим, что файл galaxy.jq содержит следующее:

.Result[]
| select(.Coordinate | (.Galaxy==$galaxy and .System==$system and .Position==$position))

Тогда вызов:

jq -f so-galaxy.jq --argjson galaxy 1 --argjson system 22 --argjson position 3 galaxy.json

даст соответствующий объект:

{
  "ID": 123456,
  "Activity": 27,
  "Name": "Example1",
  "Coordinate": {
    "Galaxy": 1,
    "System": 22,
    "Position": 3
  },
  "Administrator": false,
  "Inactive": false,
  "Vacation": false,
  "HonorableTarget": false,
  "Debris": {
    "Metal": 0,
    "Crystal": 0,
    "RecyclersNeeded": 0
  },
  "Moon": null,
  "Player": {
    "ID": 111111,
    "Name": "foo",
    "Rank": 4
  },
  "Alliance": null
}

Ключ: Формат значения

Если вы хотите, чтобы вывод был в формате key: value, просто добавьте -r к параметрам командной строки и добавьте следующее к фильтру jq:

| to_entries[]
| "\(.key): \(.value)"

Выход

ID: 123456
Activity: 27
Name: Example1
Coordinate: {"Galaxy":1,"System":22,"Position":3}
Administrator: false
Inactive: false
Vacation: false
HonorableTarget: false
Debris: {"Metal":0,"Crystal":0,"RecyclersNeeded":0}
Moon: null
Player: {"ID":111111,"Name":"foo","Rank":4}
Alliance: null
...