问题描述
我有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”:{“ data”:KEEP-THIS}}
- “ 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)