Разобрать значения 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"
}
}