我正在使用jq解析一些json红鱼数据。
尝试从下面的红鱼.txt文件中为 @odata.id 提取值。
使用推荐的 jq 调用。["@odata.id"] 似乎不能很好地提取值本身,即:/redfish/v1/Systems
欢迎任何建议。输出如下... :)
谢谢 缺口
root@ubuntu-xenial:/var/opt# cat redfish.txt
{"@odata.context":"/redfish/v1/$metadata#ServiceRoot.ServiceRoot","@odata.id":"/redfish/v1","@odata.type":"#ServiceRoot.v1_2_0.ServiceRoot","AccountService":{"@odata.id":"/redfish/v1/Managers/iDRAC.Embedded.1/AccountService"},"Chassis":{"@odata.id":"/redfish/v1/Chassis"},"Description":"Root Service","EventService":{"@odata.id":"/redfish/v1/EventService"},"Id":"RootService","JsonSchemas":{"@odata.id":"/redfish/v1/JSONSchemas"},"Links":{"Sessions":{"@odata.id":"/redfish/v1/Sessions"}},"Managers":{"@odata.id":"/redfish/v1/Managers"},"Name":"Root Service","Oem":{"Dell":{"@odata.type":"#DellServiceRoot.v1_0_0.ServiceRootSummary","IsBranded":0,"ManagerMACAddress":"d0:96:69:51:d4:70","ServiceTag":"XXXX"}},"RedfishVersion":"1.2.0","Registries":{"@odata.id":"/redfish/v1/Registries"},"SessionService":{"@odata.id":"/redfish/v1/SessionService"},"Systems":{"@odata.id":"/redfish/v1/Systems"},"Tasks":{"@odata.id":"/redfish/v1/TaskService"},"UpdateService":{"@odata.id":"/redfish/v1/UpdateService"}}
root@ubuntu-xenial:/var/opt# cat redfish.txt | jq .Systems
{
"@odata.id": "/redfish/v1/Systems"
}
root@ubuntu-xenial:/var/opt# cat redfish.txt | jq .Systems | jq .@odata.id
jq: error: syntax error, unexpected FIELD, expecting QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.@odata.id
jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:
.@odata.id
jq: 2 compile errors
root@ubuntu-xenial:/var/opt# cat redfish.txt | jq .Systems | jq .["@odata.id"]
{
"@odata.id": "/redfish/v1/Systems"
}
"/redfish/v1/Systems"
root@ubuntu-xenial:/var/opt# cat redfish.txt | jq .Systems | jq .["odata.id"]
{
"@odata.id": "/redfish/v1/Systems"
}
"/redfish/v1/Systems"
root@ubuntu-xenial:/var/opt#
您可以简单地使用过滤器:
.Systems["@odata.id"]
也就是说,在类似 bash 或 bash 的提示符下,您可以键入类似以下内容的内容:
jq '.Systems["@odata.id"]' redfish.txt
我偶然发现了这个,因为这是"jq"和"@odata.id"的duckduckgo查询评分最高的网站
不幸的是,答案是不正确的...经过一番混乱,我得到了正确的答案:
jq '.Systems.[]"@odata.id"'
由于方括号 [] 中的内容是一个数组,它是一个 0 索引(从零开始(的数字数组,因此尝试引用名为"@odata.id
"的元素(即.Systems["@odata.id"]
(,而.Systems[1]
可以工作(如果数组中有两个元素(
如果你想要所有的元素...使用上述内容,如果你想要一个特定的元素,你可以使用:
jq '.Systems[#]."odata.id"'
应该有一个较早的组件(在输出中(会告诉你有多少元素(希望如此(,类似于"Members@odata.count"
但......在我输入这个并检查你的数据后,我意识到我正在解决我的案子,看起来像你的,但不是。 在实际查看数据时,您需要的是...
jq '.Systems."@odata.id"'
因为你没有数组,你有普通的键,只需要正确的引用......
希望这有帮助