如何使用jq从json中消除包含数据的冗余字段

问题描述

我有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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...