Java 需要建议交换复杂json的键和值吗

Java 需要建议交换复杂json的键和值吗,java,json,Java,Json,我有下面的问题 { "Roles":[ { "January":[ { "CN":[ "GoogleCnFeatureOwner", "GoogleCnAnalyst", "SupportAnalyst", "AdminCn"

我有下面的问题

{  
   "Roles":[  
      {  
         "January":[  
            {  
               "CN":[  
                  "GoogleCnFeatureOwner",
                  "GoogleCnAnalyst",
                  "SupportAnalyst",
                  "AdminCn"
               ]
            },
            {  
               "EU":[  
                  "GoogleEuFeatureOwner",
                  "GoogleEuAnalyst",
                  "SupportAnalyst",
                  "AdminEu"
               ]
            },
            {  
               "NA":[  
                  "GoogleNaFeatureOwner",
                  "GoogleNaAnalyst",
                  "SupportAnalyst",
                  "AdminNa"
               ]
            }
         ]
      },
      {  
         "February":[  
            {  
               "CN":[  
                  "AbcCnFeatureOwner",
                  "AbcCnAnalyst",
                  "SupportAnalyst",
                  "AdminCn"
               ]
            },
            {  
               "EU":[  
                  "AbcEuFeatureOwner",
                  "AbcEuAnalyst",
                  "SupportAnalyst",
                  "AdminEu"
               ]
            },
            {  
               "NA":[  
                  "AbcNaFeatureOwner",
                  "AbcNaAnalyst",
                  "SupportAnalyst",
                  "AdminNa"
               ]
            }
         ]
      },
      {  
         "March":[  
            {  
               "CN":[  
                  "YahooCnFeatureOwner",
                  "SupportAnalyst",
                  "AdminCn",
                  "UserCn"
               ]
            },
            {  
               "NA":[  
                  "YahooNaFeatureOwner",
                  "SupportAnalyst",
                  "AdminNa",
                  "UserNa"
               ]
            }
         ]
      }
   ]
}
我试图用java实现一个方法来解析上面的json,并用值交换键,创建一个集合json,如下所示

    {
    "WifiCnFeatureOwner": [{
        "CN": ["January"]
    }],
    "ItSupportAnalyst": [{
        "CN": ["January", "February", "March"]
    }, {
        "EU": ["January", "February"]
    }, {
        "NA": ["January", "February", "March"]
    }]
}
我首先使用org.json API。
请提供一些最佳方法,以在没有番石榴BiMap的情况下有效实现转化。不管怎样,我会在完成后发布代码

我建议不要试图重新发明轮子。 您提到的所有您想做的事情都已经在开源库中完成了

使用Jackson或其他JSON解析器来执行JSON的初始解析。 使用番石榴BiMap获得双向映射,应该允许您交换键和值。 使用Jackson或其他废话创建新的JSON。 因为您使用的是org.json API,所以这里有一种方法

我故意没有完全完成您想要的输出,因此您必须理解代码才能修改它。下面的输出具有您想要的所有功能,但更简单

byte[]inputBytes=Files.readAllBytesPath.gettest.json; String inputText=新的StringinputBytes,StandardCharsets.US\u ASCII; JSONObject inputJson=新的JSONObject InputText; JSONObject outputJson=新的JSONObject; 对于对象monthObj:inputJson.getJSONArrayRoles{ JSONObject monthJson=JSONObject monthObj; 对于字符串monthName:monthJson.keySet{ 对于对象区域bj:monthJson.getJSONArraymonthName{ JSONObject regionJson=JSONObject RegionObject; 对于字符串regionCode:regionJson.keySet{ 对于对象roleObj:regionJson.getJSONArrayregionCode{ 字符串roleName=字符串roleObj; JSONObject role=outputJson.optJSONObject RoleName; 如果角色==null outputJson.putroleName,role=newJSONObject; JSONArray region=role.optJSONArrayregionCode; 如果区域==null role.putregionCode,region=新JSONArray; 普蒙特纳姆地区; } } } } } System.out.printlnoutputJson.toString3; 输出

手动重新格式化以提高可读性:

{
   "AbcCnAnalyst": {
      "CN": ["February"]
   },
   "AbcCnFeatureOwner": {
      "CN": ["February"]
   },
   "AbcEuAnalyst": {
      "EU": ["February"]
   },
   "AbcEuFeatureOwner": {
      "EU": ["February"]
   },
   "AbcNaAnalyst": {
      "NA": ["February"]
   },
   "AbcNaFeatureOwner": {
      "NA": ["February"]
   },
   "AdminCn": {
      "CN": ["January", "February", "March"]
   },
   "AdminEu": {
      "EU": ["January", "February"]
   },
   "AdminNa": {
      "NA": ["January", "February", "March"]
   },
   "GoogleCnAnalyst": {
      "CN": ["January"]
   },
   "GoogleCnFeatureOwner": {
      "CN": ["January"]
   },
   "GoogleEuAnalyst": {
      "EU": ["January"]
   },
   "GoogleEuFeatureOwner": {
      "EU": ["January"]
   },
   "GoogleNaAnalyst": {
      "NA": ["January"]
   },
   "GoogleNaFeatureOwner": {
      "NA": ["January"]
   },
   "SupportAnalyst": {
      "EU": ["January", "February"],
      "NA": ["January", "February", "March"],
      "CN": ["January", "February", "March"]
   },
   "UserCn": {
      "CN": ["March"]
   },
   "UserNa": {
      "NA": ["March"]
   },
   "YahooCnFeatureOwner": {
      "CN": ["March"]
   },
   "YahooNaFeatureOwner": {
      "NA": ["March"]
   }
}

{Region:CN,EU,NA}不是有效的JSON。你是说{地区:[CN,EU,NA]}吗?对不起,安德烈亚斯的打字错误。我已经更正了,你丢失了信息。SupportAnalyst将于1月和2月在所有3个区域中发布,但仅在其中两个区域的3月发布。您转换的数据无法指定。Andreas,谢谢。你说得对。我已经编辑了这个问题。请检查。@Green先生,对于您的问题,我的答案可能过于简单。现在看起来你不想反转贴图,你想反转一棵树。是的,DwB。我已经编辑了这个问题。请分享您的意见或建议。
{
   "AbcCnAnalyst": {
      "CN": ["February"]
   },
   "AbcCnFeatureOwner": {
      "CN": ["February"]
   },
   "AbcEuAnalyst": {
      "EU": ["February"]
   },
   "AbcEuFeatureOwner": {
      "EU": ["February"]
   },
   "AbcNaAnalyst": {
      "NA": ["February"]
   },
   "AbcNaFeatureOwner": {
      "NA": ["February"]
   },
   "AdminCn": {
      "CN": ["January", "February", "March"]
   },
   "AdminEu": {
      "EU": ["January", "February"]
   },
   "AdminNa": {
      "NA": ["January", "February", "March"]
   },
   "GoogleCnAnalyst": {
      "CN": ["January"]
   },
   "GoogleCnFeatureOwner": {
      "CN": ["January"]
   },
   "GoogleEuAnalyst": {
      "EU": ["January"]
   },
   "GoogleEuFeatureOwner": {
      "EU": ["January"]
   },
   "GoogleNaAnalyst": {
      "NA": ["January"]
   },
   "GoogleNaFeatureOwner": {
      "NA": ["January"]
   },
   "SupportAnalyst": {
      "EU": ["January", "February"],
      "NA": ["January", "February", "March"],
      "CN": ["January", "February", "March"]
   },
   "UserCn": {
      "CN": ["March"]
   },
   "UserNa": {
      "NA": ["March"]
   },
   "YahooCnFeatureOwner": {
      "CN": ["March"]
   },
   "YahooNaFeatureOwner": {
      "NA": ["March"]
   }
}