Разобрать значения JSON и JSON с помощью jq

У меня есть API, который возвращает JSON - большие блоки этого. Некоторые пары ключ-значение имеют больше блоков JSON в качестве значения, связанного с ключом. jq отлично разбирает основные уровни JSON. Но я не могу найти способ заставить его "пересчитать" значения, связанные с ключами, а также распечатать их.

Вот начало одного из возвращений JSON. Обратите внимание, что это всего лишь небольшой процент от полной доходности:

    {
  "code": 200,
  "status": "OK",
  "data": {
    "PlayFabId": "xxxxxxx",
    "InfoResultPayload": {
      "AccountInfo": {
        "PlayFabId": "xxxxxxxx",
        "Created": "2018-03-22T19:23:29.018Z",
        "TitleInfo": {
          "Origination": "IOS",
          "Created": "2018-03-22T19:23:29.033Z",
          "LastLogin": "2018-03-22T19:23:29.033Z",
          "FirstLogin": "2018-03-22T19:23:29.033Z",
          "isBanned": false
        },
        "PrivateInfo": {},
        "IosDeviceInfo": {
          "IosDeviceId": "xxxxxxxxx"
        }
      },
      "UserVirtualCurrency": {
        "GT": 10,
        "MB": 70
      },
      "UserVirtualCurrencyRechargeTimes": {},
      "UserData": {},
      "UserDataVersion": 15,
      "UserReadOnlyData": {
        "DataVersion": {
          "Value": "6",
          "LastUpdated": "2018-03-22T19:48:59.543Z",
          "Permission": "Public"
        },
        "achievements": {
          "Value": "[{\"id\":0,\"gamePack\":\"GAME.PACK.0.KK\",\"marblesAmount\":50,\"achievements\":[{\"id\":2,\"name\":\"Correct Round 4\",\"description\":\"Round 4 answered correctly\",\"maxValue\":10,\"increment\":1,\"currentValue\":3,\"valueUnit\":\"unit\",\"awardOnIncrement\":true,\"marbles\":10,\"image\":\"https://www.jamandcandy.com/kissinkuzzins/achievements/icons/sphinx\",\"SuccessKey\":[\"0_3_4_0\",\"0_5_4_0\",\"0_6_4_0\",\"0_7_4_0\",\"0_8_4_0\",\"0_9_4_0\",\"0_10_4_0\"],\"event\":\"Player_answered_round\",\"achieved\":false},{\"id\":0,\"name\":\"Complete

Это было проанализировано с помощью jq, но, как вы можете видеть, когда вы добираетесь до

"achievements": { "Vales": "[{\"id\":0,\"gamePack\":\"GAME.PACK.0.KK\",\"marblesAmount\":50,\

lq больше не анализирует значение at также JSON.

Есть ли фильтр, который мне не хватает, чтобы заставить его анализировать значения, а также структуру более высокого уровня?

1 ответ

Есть ли фильтр, которого мне не хватает...?

Вам понадобится фильтр fromjson, но он должен применяться только к строковому JSON; поэтому рассмотрим использование |= как показано с использованием вашего фрагмента:

echo '{"achievements": { "Vales": "[{\"id\":0,\"gamePack\":\"GAME.PACK.0.KK\",\"marblesAmount\":50}]"}}' | 
  jq '.achievements.Vales |= fromjson'

{
  "achievements": {
    "Vales": [
      {
        "id": 0,
        "gamePack": "GAME.PACK.0.KK",
        "marblesAmount": 50
      }
    ]
  }
}

рекурсивно /1

Если вы хотите подать заявку fromjson по возможности рекурсивно, тогда recursively твой друг:

def recursively(f):
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key]  | recursively(f) )} )
  elif type == "array" then map( recursively(f) )
  else try (f as $f | if $f == . then . else ($f | recursively(f)) end) catch $in
  end;

Это будет применяться следующим образом:

recursively(fromjson)

пример

{a: ({b: "xyzzy"}) | tojson} | tojson 
| recursively(fromjson)

выходы:

{
  "a": {
    "b": "xyzzy"
  }
}
Другие вопросы по тегам