如何使用 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"
          }
        }
      }
    }
  }
}

我正在尝试消除

的无关嵌套
    {
      "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)