作为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结构,我不确定如何用它来表达以上内容。
以下内容将产生空结果,但应返回该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
$
我还是在做错什么?
======
根据注释中的建议,以下带有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'
答案 0 :(得分:0)
使用jq版本1.6、1.5和1.4,我已经使用数据的JSON版本测试了jq程序,并且一切正常(在Mac上)。
请阅读http://stackoverflow.com/help/mcve-如果您遵循这些准则,则对于所有相关人员来说,调试,通信和/或寿命通常将大大简化。
我建议至少在调试时将jq程序放入文件中并使用-f命令行选项。