Фильтрация результатов JSON curl с помощью селекторов jq - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующая структура JSON с несколькими записями, полученная в ответ от веб-службы:

  [
    {
    "model": "analytics.request",
    "pk": 89,
    "fields": {
        "intent": "GetUserAccountInformation",
        "sub_intent": "",
        "request_text": "what is my balance",
        "response_text": "You have $111,111.11 and owe $111,111. Shall I break that down?",
        "session_id": "1v69yiptamgse1niap51zr2o9x154169081480766b2d6b7-d3ce-4166-9292-c4669a3dfc14",
        "user_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I",
        "device_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ",
        "device_type": "alexa",
        "device_model": "NA",
        "device_os": "alexa",
        "elapsed_time": 23286,
        "region": "NA",
        "latitude": 0,
        "longitude": 0,
        "date": "2018-11-08T15:31:48.757+0000",
        "ext_session_id": "",
        "ext_user_id": "",
        "score": 1,
        "platform_type": "alexa",
        "platform_user_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I",
        "platform_conversation_id": "amzn1.echo-api.session.9122211c-7fa8-43ae-b7e3-e56ebbdacc01",
        "registered": false,
        "segment_names": [
            "Seg0715080610AM",
            "Seg0715071857AM",
            "Seg0715070437AM",
            "Seg0715063307AM",
            "Seg0715054215AM",
            "Seg0715054027AM",
            "Seg0715053845AM",
            "Seg0715053646AM",
            "Seg0715053156AM",
            "Seg0715052407AM",
            "Seg0715045748AM",
            "Seg0714145246PM",
            "Seg0714135150PM",
            "Seg0714134041PM",
            "Seg0714012505AM",
            "Seg0714004152AM",
            "Seg0714002843AM",
            "Seg0713235444PM",
            "Seg0713230241PM",
            "Seg0713230030PM",
            "Seg0713225825PM",
            "Seg0713225548PM",
            "Seg0713225028PM",
            "Seg0713224159PM",
            "Seg0713220356PM",
            "Seg0711155346PM",
            "Seg0711154018PM",
            "Seg0711153432PM",
            "Seg0711140748PM",
            "Seg0711135636PM",
            "Seg0711131412PM",
            "Seg0711130857PM",
            "Seg0711130157PM",
            "Seg0711125338PM",
            "Seg0711113158AM",
            "customer",
            "cmstest7",
            "cmstest5",
            "cmstest3",
            "cmstest2",
            "gffyrth",
            "1testQR",
            "1testgallery",
            "121212"
        ]
    }
},
{
    "model": "analytics.request",
    "pk": 90,
    "fields": {
        "intent": "GetUserAccountInformation",
        "sub_intent": "",
        "request_text": "what is my balance",
        "response_text": "You have $111,111.11 and owe $111,111. Shall I break that down?",
        "session_id": "1v69yiptamgse1niap51zr2o9x154169081480766b2d6b7-d3ce-4166-9292-c4669a3dfc14",
        "user_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I",
        "device_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ",
        "device_type": "alexa",
        "device_model": "NA",
        "device_os": "alexa",
        "elapsed_time": 2013,
        "region": "NA",
        "latitude": 0,
        "longitude": 0,
        "date": "2018-11-08T15:32:40.090+0000",
        "ext_session_id": "",
        "ext_user_id": "",
        "score": 1,
        "platform_type": "alexa",
        "platform_user_id": "amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I",
        "platform_conversation_id": "amzn1.echo-api.session.8586bff8-21a5-4336-9c9f-1c261362b89d",
        "registered": false,
        "segment_names": [
            "Test_Segment0731174425PM",
            "Test_Segment0731172344PM",
            "Test_Segment0731165438PM",
            "Test_Segment0731164321PM",
            "Test_Segment0731163349PM",
            "Test_Segment0731161939PM",
            "Test_Segment0731160424PM",
            "Test_Segment0730160925PM",
            "Test_Segment0730154627PM",
            "Test_Segment0730152806PM",
            "Test_Segment0730152328PM",
            "Test_Segment0730150203PM",
            "Test_Segment0730141720PM",
            "Test_Segment0730141304PM",
            "testseg",
            "Tester",
            "Test0730162816PM",
            "Test0730162304PM",
            "Test0730161031PM",
            "Test0730160632PM",
            "Test0730160502PM",
            "Seg0730154521PM",
            "Seg0730154322PM",
            "Seg0730153811PM",
            "Seg0730153303PM",
            "Seg0716231700PM",
            "Seg0716230741PM",
            "Seg0715080610AM",
            "Seg0715071857AM",
            "Seg0715070437AM",
            "Seg0715063307AM",
            "Seg0715054215AM",
            "Seg0715054027AM",
            "Seg0715053845AM",
            "Seg0715053646AM",
            "Seg0715053156AM",
            "Seg0715052407AM",
            "Seg0715045748AM",
            "Seg0714145246PM",
            "Seg0714135150PM",
            "Seg0714134041PM",
            "Seg0714012505AM",
            "Seg0714004152AM",
            "Seg0714002843AM",
            "Seg0713235444PM",
            "Seg0713230241PM",
            "Seg0713230030PM",
            "Seg0713225825PM",
            "Seg0713225548PM",
            "Seg0713225028PM",
            "Seg0713224159PM",
            "Seg0713220356PM",
            "Seg0711155346PM",
            "Seg0711154018PM",
            "Seg0711153432PM",
            "Seg0711140748PM",
            "Seg0711135636PM",
            "Seg0711131412PM",
            "Seg0711130857PM",
            "Seg0711130157PM",
            "Seg0711125338PM",
            "Seg0711113158AM",
            "customer",
            "cmstest7",
            "cmstest5",
            "cmstest3",
            "cmstest2",
            "gffyrth",
            "1testQR",
            "1testgallery",
            "121212"
        ]
    }
},
{...},
{...},
{...}
]

и я хочу извлечь из нее только определенные объекты (с jq), используя ее селекторы.

Скажем, вернуть только те записи, где .fields.user_id == "abc"

Или же вернуть только те записи, где .fields.session_id =="1e2d3f"

select, кажется, способ достичь этого, но я не уверен, как выразить вышеизложенное с его учетом структуры JSON выше.

enter image description here

Следующее дает пустой результат, тогда как оно должно возвращать записи для этого session_id:

curl -X GET   'http://localhost:8090/xxx/api/v1/results?dr=last5days'   -H 'Cache-Control: no-cache'   -H 'Postman-Token: f6b819d0-f4f6-4def-bccb-3967366779c7'   -H 'secret: 5a04bfef-39eb-435a-a0d0-b274592790bb' | jq '.[] | select(.fields.session_id=="1v69yiptamgse1niap51zr2o9x154169081480766b2d6b7-d3ce-4166-9292-c4669a3dfc14")'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21785    0 21785    0     0   272k      0 --:--:-- --:--:-- --:--:--  272k
$

Попытка различных комбинаций с функциями jq entries, которые невполне работа:

curl -X GET   'http://localhost:8080/xxx/api/v1/results?dr=last5days'   -H 'Cache-Control: no-cache'   -H 'Postman-Token: f6b819d0-f4f6-4def-bccb-3967366779c7'   -H 'secret: 5a04bf34ef-39eb-435a-a0d0-b278765790bb' | jq  'with_entries(select(.value.pk==98))'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 31755    0 31755    0     0   127k      0 --:--:-- --:--:-- --:--:--  127k
jq: error (at <stdin>:274): Cannot use number (9) as object key

Может кто-нибудь, пожалуйста, помогите мне создать правильный jq запрос?TIA.

===

Попытка реализовать предложение, выраженное в комментариях:

Это jq выражение:

map(select(.fields.user_id=="amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I")) | length

, кажется,работать в JQ Playground (возвращает правильный счет 3 ):

enter image description here

, но при использовании в командной строке, онвозвращает неправильный результат (и пустой массив длиной 0 ):

$ curl -X GET   'http://localhost:8080/xxx/api/v1/results?dr=last5days'   -H 'Cache-Control: no-cache'   -H 'Postman-Token: f6b819d0-f4f6-4def-bccb-3967366779c7'   -H 'secret: 5a04bfef-39eb-435a-a0d0-b271392790bb' | jq  'map(select(.fields.user_id=="amzn1.ask.account.AHMFB2H7ZXMSCB5TLPYWCPBJGWGHFYQZ6OPPMEPQ7CT2LZXNPAFJMJELXXCCTEZ2JUE5PXRSBJHJTO3AVXT3C63AOEZLIEP3D3HIFBT5M23G4ORENFRT54AAK7I4X2HCORXJAB2UGQAHPE2TC75F2GWWZWSPO2CWEAZJJN7LJYFWEYHEJDLNQ6FSUD5LQWKBUC347K3IF32IV3I")) | length'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 21785    0 21785    0     0  95630      0 --:--:-- --:--:-- --:--:-- 95969
0
$

Что я все еще делаю неправильно?

======

Согласно предложениям в комментариях, следующий запрос с отладкой возвращает JSON, но по-прежнему не дает правильных значений:

$ curl -X GET   'http://localhost:8080/xxx/api/v1/results?dr=last5days'   -H 'Cache-Control: no-cache'   -H 'Postman-Token: f6b819d0-f4f6-4def-bccb-3967366779c7'   -H 'secret: 5a04bfef-39eb-435a-a0d0-b271392790bb' | jq  ' debug | map(select(.fields.session_id=="1v69yiptamgse1niap51zr2o9x154169081480766b2d6b7-d3ce-4166-9292-c4669a3dfc14")) | length'

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018
  1. Используя jq версий 1.6, 1.5 и 1.4, я протестировал вашу jq-программу с использованием JSON-версии данных, и все хорошо (на Mac).

  2. Пожалуйста, прочитайте http://stackoverflow.com/help/mcve - если вы следуете этим рекомендациям, это должно значительно облегчить отладку, общение и / или жизнь в целом для всех заинтересованных сторон.

  3. Я бы предложил поместить вашу jq-программу в файл и использовать параметр командной строки -f, по крайней мере, пока вы отлаживаете это.

...