我有以下多记录 JSON 结构作为来自 Web 服务的响应:
[
{
"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 结构,我不确定如何用它来表达上述内容。
以下产生空结果,而它应该返回该 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计数):
但是在命令行上使用时,它返回错误的结果(和长度为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'