使用jq选择器过滤JSON curl结果

时间:2018-11-13 23:36:00

标签: json web-services jq json-query

作为Web服务的响应,我具有以下多记录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
$

我还是在做错什么?

======

根据注释中的建议,以下带有debug的查询返回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 :(得分:0)

  1. 使用jq版本1.6、1.5和1.4,我已经使用数据的JSON版本测试了jq程序,并且一切正常(在Mac上)。

  2. 请阅读http://stackoverflow.com/help/mcve-如果您遵循这些准则,则对于所有相关人员来说,调试,通信和/或寿命通常将大大简化。

  3. 我建议至少在调试时将jq程序放入文件中并使用-f命令行选项。