如何使用 jq 消除包含来自 json 的数据的冗余字段
how can I eliminate redundant fields containing data from json with jq
我 json 的信息包含在需要删除的类型和数据结构中。我的结构如下:
{
"Board: WEC": {
"ExprMap": {
"data": {
"noAddr": {
"ExprString": {
"data": "11112aoa6NLYomYZro566XZVGEXyCDqeqDcp8Pzg81Ckuws6SexC99"
}
},
"shortDesc": {
"ExprString": {
"data": "Wile E. Coyote for Board Member"
}
},
"yesAddr": {
"ExprString": {
"data": "11112gUFvJR6JBDYJURETaWUBpEDa1EyjgRHFncEfQ4hGECnciPnhw"
}
}
}
}
},
"Board: DaD": {
"ExprMap": {
"data": {
"noAddr": {
"ExprString": {
"data": "11112Cwtg2Bs4WUAYrXhL9xZXXSXr9Gn62Cty39RhUaBnqjrKkqwAZ"
}
},
"shortDesc": {
"ExprString": {
"data": "Daffy Duck for Board Member"
}
},
"yesAddr": {
"ExprString": {
"data": "1111TnFUN7eZBWXp3QQACQRRxpcS5uH5Bpf67vikWhA5e3F6ikAmU"
}
}
}
}
}
}
我正在尝试消除
的无关嵌套
- “ExprMap”:{“数据”:保持这个}}
- "ExprString": { "data": KEEP-THIS } }
得到
{
"Board: WEC": {
"noAddr": "11112aoa6NLYomYZro566XZVGEXyCDqeqDcp8Pzg81Ckuws6SexC99",
"shortDesc": "Wile E. Coyote for Board Member",
"yesAddr": "11112gUFvJR6JBDYJURETaWUBpEDa1EyjgRHFncEfQ4hGECnciPnhw"
},
"Board: DaD": {
"noAddr": "11112Cwtg2Bs4WUAYrXhL9xZXXSXr9Gn62Cty39RhUaBnqjrKkqwAZ",
"shortDesc": "Daffy Duck for Board Member",
"yesAddr": "1111TnFUN7eZBWXp3QQACQRRxpcS5uH5Bpf67vikWhA5e3F6ikAmU"
}
帮助将不胜感激。谢谢。
map_values
可以完成任务,或者至少以下 jq 表达式可以完成任务:
map_values( .ExprMap.data | map_values(.ExprString.data) )
这是一个使用更通用方法的解决方案:
walk(if type == "object"
then if has("ExprMap") then del(.ExprMap) + (.ExprMap.data | map_values(.ExprString.data)) else . end
else . end)
这是我认为可以解决评论中提出的扩展问题的方法。也就是说,它处理 ExprTuple、ExprList、ExprMap 和 ExprString,并且可以轻松扩展以涵盖其他“Expr”类型。
def detype:
if type == "object"
then if has("ExprTuple") then .ExprTuple.data | map(detype)
elif has("ExprList") then .ExprList.data | map(detype)
elif has("ExprMap") then .ExprMap.data | detype
elif has("ExprString") then .ExprString.data
else . end
else . end;
walk(detype)
我 json 的信息包含在需要删除的类型和数据结构中。我的结构如下:
{
"Board: WEC": {
"ExprMap": {
"data": {
"noAddr": {
"ExprString": {
"data": "11112aoa6NLYomYZro566XZVGEXyCDqeqDcp8Pzg81Ckuws6SexC99"
}
},
"shortDesc": {
"ExprString": {
"data": "Wile E. Coyote for Board Member"
}
},
"yesAddr": {
"ExprString": {
"data": "11112gUFvJR6JBDYJURETaWUBpEDa1EyjgRHFncEfQ4hGECnciPnhw"
}
}
}
}
},
"Board: DaD": {
"ExprMap": {
"data": {
"noAddr": {
"ExprString": {
"data": "11112Cwtg2Bs4WUAYrXhL9xZXXSXr9Gn62Cty39RhUaBnqjrKkqwAZ"
}
},
"shortDesc": {
"ExprString": {
"data": "Daffy Duck for Board Member"
}
},
"yesAddr": {
"ExprString": {
"data": "1111TnFUN7eZBWXp3QQACQRRxpcS5uH5Bpf67vikWhA5e3F6ikAmU"
}
}
}
}
}
}
我正在尝试消除
的无关嵌套- “ExprMap”:{“数据”:保持这个}}
- "ExprString": { "data": KEEP-THIS } } 得到
{
"Board: WEC": {
"noAddr": "11112aoa6NLYomYZro566XZVGEXyCDqeqDcp8Pzg81Ckuws6SexC99",
"shortDesc": "Wile E. Coyote for Board Member",
"yesAddr": "11112gUFvJR6JBDYJURETaWUBpEDa1EyjgRHFncEfQ4hGECnciPnhw"
},
"Board: DaD": {
"noAddr": "11112Cwtg2Bs4WUAYrXhL9xZXXSXr9Gn62Cty39RhUaBnqjrKkqwAZ",
"shortDesc": "Daffy Duck for Board Member",
"yesAddr": "1111TnFUN7eZBWXp3QQACQRRxpcS5uH5Bpf67vikWhA5e3F6ikAmU"
}
帮助将不胜感激。谢谢。
map_values
可以完成任务,或者至少以下 jq 表达式可以完成任务:
map_values( .ExprMap.data | map_values(.ExprString.data) )
这是一个使用更通用方法的解决方案:
walk(if type == "object"
then if has("ExprMap") then del(.ExprMap) + (.ExprMap.data | map_values(.ExprString.data)) else . end
else . end)
这是我认为可以解决评论中提出的扩展问题的方法。也就是说,它处理 ExprTuple、ExprList、ExprMap 和 ExprString,并且可以轻松扩展以涵盖其他“Expr”类型。
def detype:
if type == "object"
then if has("ExprTuple") then .ExprTuple.data | map(detype)
elif has("ExprList") then .ExprList.data | map(detype)
elif has("ExprMap") then .ExprMap.data | detype
elif has("ExprString") then .ExprString.data
else . end
else . end;
walk(detype)