jq transform JSON 结果集按参数名(参数无严格顺序)
jq transform JSON resultset by parameter names (no strict order of paramaters)
我已经尝试了很多,但都没有成功。
我在转换以下 JSON 结构时遇到问题:
JSON:
{
"?xml":{
"@version":"1.0",
"@encoding":"UTF-8"
},
"methodResponse":{
"params":{
"param":{
"value":{
"struct":{
"member":[
{
"name":"severity",
"value":{
"string":"Important"
}
},
{
"name":"product",
"value":{
"string":"this is a product name"
}
},
{
"name":"notes",
"value":{
"string":"Here are some notes"
}
},
{
"name":"references",
"value":{
"string":"This is a reference"
}
},
{
"name":"release",
"value":{
"i4":"1"
}
},
{
"name":"last_modified_date",
"value":{
"string":"2020-03-10 15:21:50.147896"
}
}
]
}
}
}
}
}
}
我想像在这个转换语句(已经使用一个键名)中那样按键名过滤它:
变换语句:
map(.methodResponse.params.param.value.struct.member[] | select(.name == "product" ).value.string as $product| {$product})
但是当我想在一条语句中返回多个键名时,我不确定语法应该是什么样子。
我希望得到这样的结果:
[
{
"product": "This is a product name",
"release": "1",
"last_modified_date": "2020-03-09 16:39:39.0"
}
]
我对这个话题不太熟悉,单独尝试需要很长时间...
有人可以帮忙吗?非常感谢任何帮助!
谢谢!
首先,如果您想使用 jq
,您需要格式正确的 JSON 数据。 human JSON tool hjson
可能对您的输入数据有帮助。
hjson -j file
可以通过以下方式提取想要的数据:
hjson -j file | \
jq '.methodResponse.params.param.value.struct.member |
[map({(.name):(.value.string//.value.i4)})|add]'
它只是根据 name
和 value
参数创建 ne 对象。
请注意,如果 .value.string
不存在,它将使用 .value.i4
和备用运算符 //
。
我已经尝试了很多,但都没有成功。 我在转换以下 JSON 结构时遇到问题:
JSON:
{
"?xml":{
"@version":"1.0",
"@encoding":"UTF-8"
},
"methodResponse":{
"params":{
"param":{
"value":{
"struct":{
"member":[
{
"name":"severity",
"value":{
"string":"Important"
}
},
{
"name":"product",
"value":{
"string":"this is a product name"
}
},
{
"name":"notes",
"value":{
"string":"Here are some notes"
}
},
{
"name":"references",
"value":{
"string":"This is a reference"
}
},
{
"name":"release",
"value":{
"i4":"1"
}
},
{
"name":"last_modified_date",
"value":{
"string":"2020-03-10 15:21:50.147896"
}
}
]
}
}
}
}
}
}
我想像在这个转换语句(已经使用一个键名)中那样按键名过滤它:
变换语句:
map(.methodResponse.params.param.value.struct.member[] | select(.name == "product" ).value.string as $product| {$product})
但是当我想在一条语句中返回多个键名时,我不确定语法应该是什么样子。
我希望得到这样的结果:
[
{
"product": "This is a product name",
"release": "1",
"last_modified_date": "2020-03-09 16:39:39.0"
}
]
我对这个话题不太熟悉,单独尝试需要很长时间... 有人可以帮忙吗?非常感谢任何帮助!
谢谢!
首先,如果您想使用 jq
,您需要格式正确的 JSON 数据。 human JSON tool hjson
可能对您的输入数据有帮助。
hjson -j file
可以通过以下方式提取想要的数据:
hjson -j file | \
jq '.methodResponse.params.param.value.struct.member |
[map({(.name):(.value.string//.value.i4)})|add]'
它只是根据 name
和 value
参数创建 ne 对象。
请注意,如果 .value.string
不存在,它将使用 .value.i4
和备用运算符 //
。