如何使用 JQ 重新格式化多个级别的 JSON?

问题描述 投票:0回答:1

我怀疑我给自己设定了一项不可能完成的任务,并且在查看此论坛上发布的类似问题时取得了一些小进步,但这一个让我难住了。

这是我的 JSON 源代码。

{
  "totalCount": "3",
  "imdata": [
    {
      "fvTenant": {
        "attributes": {
          "dn": "uni/tn-Tenant10",
          "name": "Tenant10"
        },
        "children": [
          {
            "fvAp": {
              "attributes": {
                "name": "2Tier_AP"
              },
              "children": [
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "WebServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "AppServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "fvTenant": {
        "attributes": {
          "dn": "uni/tn-Tenant18",
          "name": "Tenant18"
        },
        "children": [
          {
            "fvAp": {
              "attributes": {
                "name": "3Tier_AP"
              },
              "children": [
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "DBServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCustQosPol": {
                          "attributes": {}
                        }
                      },
                      {
                        "fvRsBd": {
                          "attributes": {},
                          "children": [
                            {
                              "fvSubnetBDDefCont": {
                                "attributes": {
                                  "bddefDn": "uni/bd-[uni/tn-Tenant18/BD-App_BD]-isSvc-no",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "AppServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "DBServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-DBServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "WebServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant18/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "fvTenant": {
        "attributes": {
          "dn": "uni/tn-Tenant17",
          "name": "Tenant17"
        },
        "children": [
          {
            "fvAp": {
              "attributes": {
                "name": "2Tier_AP"
              },
              "children": [
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "WebServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsDomAtt": {
                          "attributes": {
                            "tDn": "uni/phys-T17:MappedVLANs_PhysDom"
                          }
                        }
                      },
                      {
                        "fvRsCustQosPol": {
                          "attributes": {}
                        }
                      },
                      {
                        "fvRsBd": {
                          "attributes": {},
                          "children": [
                            {
                              "fvSubnetBDDefCont": {
                                "attributes": {
                                  "bddefDn": "uni/bd-[uni/tn-Tenant17/BD-Web_BD]-isSvc-no",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "AppServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "Any.IP_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-Any.IP_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          },
          {
            "fvAp": {
              "attributes": {
                "name": "3Tier_AP"
              },
              "children": [
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "DBServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "DBServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-DBServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "AppServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "DBServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-common/brc-DBServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "fvAEPg": {
                    "attributes": {
                      "name": "WebServers_EPG"
                    },
                    "children": [
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsCons": {
                          "attributes": {
                            "tnVzBrCPName": "AppServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-AppServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      },
                      {
                        "fvRsProv": {
                          "attributes": {
                            "tnVzBrCPName": "MgmtServices_Ct"
                          },
                          "children": [
                            {
                              "fvCollectionCont": {
                                "attributes": {
                                  "collectionDn": "uni/tn-Tenant17/brc-MgmtServices_Ct",
                                  "name": "",
                                  "nameAlias": ""
                                }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    }
  ]
}

我需要将其变成更具可读性的东西,理想情况下,我希望它看起来像这样(以下是有效的 JSON,但如果它不严格准确,我并不挑剔 - 通用格式才是重要的)

[
   {
      "fvTenant": "Tenant10",
      "fvAp": [
         {
            "2Tier_AP": {
               "fvAEPg": [
                  {
                     "WebServers_EPG": {
                        "fvRsCons": [
                           "AppServices_Ct"
                        ],
                        "fvRsProv": []
                     },
                     "AppServers_EPG": {
                        "fvRsCons": [],
                        "fvRsProv": [
                           "AppServices_Ct"
                        ]
                     }
                  }
               ]
            }
         }
      ]
   },
   {
      "fvTenant": "Tenant18",
      "fvAp": [
         {
            "3Tier_AP": {
               "fvAEPg": [
                  {
                     "DBServers_EPG": {
                        "fvRsCons": [],
                        "fvRsProv": []
                     },
                     "AppServers_EPG": {
                        "fvRsCons": [
                           "MgmtServices_Ct",
                           "DBServices_Ct"
                        ],
                        "fvRsProv": [
                           "AppServices_Ct",
                           "MgmtServices_Ct"
                        ]
                     },
                     "WebServers_EPG": {
                        "fvRsCons": [
                           "MgmtServices_Ct",
                           "AppServices_Ct"
                        ],
                        "fvRsProv": [
                           "MgmtServices_Ct"
                        ]
                     }
                  }
               ]
            }
         }
      ]
   },
   {
      "fvTenant": "Tenant17",
      "fvAp": [
         {
            "2Tier_AP": {
               "fvAEPg": [
                  {
                     "WebServers_EPG": {
                        "fvRsCons": [],
                        "fvRsProv": []
                     },
                     "AppServers_EPG": {
                        "fvRsCons": [
                           "Any.IP_Ct"
                        ],
                        "fvRsProv": []
                     }
                  }
               ]
            }
         },
         {
            "3Tier_AP": {
               "fvAEPg": [
                  {
                     "DBServers_EPG": {
                        "fvRsCons": [
                           "DBServices_Ct",
                           "MgmtServices_Ct"
                        ],
                        "fvRsProv": [
                           "AppServices_Ct",
                           "MgmtServices_Ct"
                        ]
                     },
                     "AppServers_EPG": {
                        "fvRsCons": [
                           "DBServices_Ct",
                           "MgmtServices_Ct"
                        ],
                        "fvRsProv": [
                           "AppServices_Ct",
                           "MgmtServices_Ct"
                        ]
                     },
                     "WebServers_EPG": {
                        "fvRsCons": [
                           "MgmtServices_Ct",
                           "AppServices_Ct"
                        ],
                        "fvRsProv": [
                           "MgmtServices_Ct"
                        ]
                     }
                  }
               ]
            }
         }
      ]
   }
]

我已经设法分离出“fvTenant”键和值,并使用jqplay将“fvAp”放入数组中 - 这是我的尝试https://jqplay.org/s/tNIPrGaEI96

jq '.imdata[].fvTenant | {fvTenant: .attributes.name, fvAp: [.children[].fvAp]} '

给了我以下内容:

{"fvTenant":"Tenant10","fvAp":[{"attributes":{"name":"2Tier_AP"},"children":[{"fvAEPg":{"attributes":{"name":"WebServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-AppServices_Ct","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"AppServers_EPG"},"children":[{"fvRsProv":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-AppServices_Ct","name":"","nameAlias":""}}}]}}]}}]}]}
{"fvTenant":"Tenant18","fvAp":[{"attributes":{"name":"3Tier_AP"},"children":[{"fvAEPg":{"attributes":{"name":"DBServers_EPG"},"children":[{"fvRsCustQosPol":{"attributes":{}}},{"fvRsBd":{"attributes":{},"children":[{"fvSubnetBDDefCont":{"attributes":{"bddefDn":"uni/bd-[uni/tn-Tenant18/BD-App_BD]-isSvc-no","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"AppServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsCons":{"attributes":{"tnVzBrCPName":"DBServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-DBServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-AppServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"WebServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsCons":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-AppServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant18/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}}]}}]}]}
{"fvTenant":"Tenant17","fvAp":[{"attributes":{"name":"2Tier_AP"},"children":[{"fvAEPg":{"attributes":{"name":"WebServers_EPG"},"children":[{"fvRsDomAtt":{"attributes":{"tDn":"uni/phys-T17:MappedVLANs_PhysDom"}}},{"fvRsCustQosPol":{"attributes":{}}},{"fvRsBd":{"attributes":{},"children":[{"fvSubnetBDDefCont":{"attributes":{"bddefDn":"uni/bd-[uni/tn-Tenant17/BD-Web_BD]-isSvc-no","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"AppServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"Any.IP_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-Any.IP_Ct","name":"","nameAlias":""}}}]}}]}}]},{"attributes":{"name":"3Tier_AP"},"children":[{"fvAEPg":{"attributes":{"name":"DBServers_EPG"},"children":[{"fvRsProv":{"attributes":{"tnVzBrCPName":"DBServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-DBServices_Ct","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"AppServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"DBServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-common/brc-DBServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsCons":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-AppServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}}]}},{"fvAEPg":{"attributes":{"name":"WebServers_EPG"},"children":[{"fvRsCons":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsCons":{"attributes":{"tnVzBrCPName":"AppServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-AppServices_Ct","name":"","nameAlias":""}}}]}},{"fvRsProv":{"attributes":{"tnVzBrCPName":"MgmtServices_Ct"},"children":[{"fvCollectionCont":{"attributes":{"collectionDn":"uni/tn-Tenant17/brc-MgmtServices_Ct","name":"","nameAlias":""}}}]}}]}}]}]}

我似乎需要以类似的方式处理 fvAp 数组,但我没有成功地隔离数组来处理它。 欢迎任何建议。

jq reformatting
1个回答
0
投票

再次将流收集到数组或使用map(其实现方式与此完全相同:它构造一个新数组并收集流)。您甚至可以将您的

fvAp
属性收集到一个数组中:
[ .imdata[].fvTenant
  | {
    fvTenant: .attributes.name,
    fvAp: [.children[].fvAp]
  }
]

map

.imdata | map(.fvTenant | { fvTenant: .attributes.name, fvAp: (.children | map(.fvAp)) } )

© www.soinside.com 2019 - 2024. All rights reserved.