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



我有以下 json

{  
"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(。无论如何,一旦完成,我就会发布代码。

由于您使用的是org.jsonAPI,因此这里有一种方法可以做到这一点。

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

byte[] inputBytes = Files.readAllBytes(Paths.get("test.json"));
String inputText = new String(inputBytes, StandardCharsets.US_ASCII);
JSONObject inputJson = new JSONObject(inputText);
JSONObject outputJson = new JSONObject();
for (Object monthObj : inputJson.getJSONArray("Roles")) {
JSONObject monthJson = (JSONObject) monthObj;
for (String monthName : monthJson.keySet()) {
for (Object regionObj : monthJson.getJSONArray(monthName)) {
JSONObject regionJson = (JSONObject) regionObj;
for (String regionCode : regionJson.keySet()) {
for (Object roleObj : regionJson.getJSONArray(regionCode)) {
String roleName = (String) roleObj;
JSONObject role = outputJson.optJSONObject(roleName);
if (role == null)
outputJson.put(roleName, role = new JSONObject());
JSONArray region = role.optJSONArray(regionCode);
if (region == null)
role.put(regionCode, region = new JSONArray());
region.put(monthName);
}
}
}
}
}
System.out.println(outputJson.toString(3));

输出

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

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

{
"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"]
}
}

我建议不要尝试重新发明轮子。 您提到的要做的一切都已经在开源库中完成。

  1. 使用 Jackson(或其他一些 JSON 解析器(执行 JSON 的初始解析。
  2. 使用番石榴BiMap获取双向地图(应该允许您交换键和值(。
  3. 使用杰克逊(或其他等等(创建新的 JSON。

最新更新