Json String
은 더 중첩 된 다른 객체가있는 객체를 나타냅니다. 또한, 내가이 Json String
에서 제거해야하는 키 목록이 있습니다. 이 키는이 문자열 안에있는 객체의 중첩 된 레벨에있을 수 있습니다. 마지막으로이 편집 된 Json 문자열을 다른 문자열과 비교하여 차이점을 출력해야합니다. 비교할 때 키를 무시해야하기 때문에 첫 번째 Json 문자열에서 해당 키 - 값 쌍을 제거해야합니다. 현재, 나는 Json String을 Gson API
에서 제공되는 LinkedTreeMap
으로 변환 한 다음 Map.difference()
을 비교합니다. 이에 대한 해결책을 제안하십시오.LinkedTreeMap을 사용하여 Json String에서 키 - 값 쌍 (모든 수준에서 중첩)을 제거합니다.
-1
A
답변
1
중첩 된 LinkedTreeMap에서 필드를 찾을 때까지 재귀 적으로 탐색하여 존재하는 경우 제거했습니다. Key
의 전체 경로합니다 (JSON 문자열에서 내림차순을 제거하려면 아래의 JSON 예제처럼 "objects.desc") 개체 내부
JSON 샘플을 정확한 키 - 값의 위치를 얻기 위해 제공 될 필요가 :
{
"message": "MSG",
"code": "COD001",
"objects": [
{
"resource": "Student",
"field": "StudentId",
"desc": "Student Description"
}
]
}
코드 샘플 :
public MapDifference<String, Object> getMapDifference(String jsonString1, String jsonString2) {
MapDifference<String, Object> mapDifference = null;
Gson gson = new Gson();
Type mapType = new TypeToken<Map<String, Object>>() {
}.getType();
Map<String, Object> firstMap = gson.fromJson(jsonString1, mapType);
Map<String, Object> secondMap = gson.fromJson(jsonString2, mapType);
firstMap = CollectionUtils.isEmpty(firstMap) ? new HashMap<>() : firstMap;
secondMap = CollectionUtils.isEmpty(secondMap) ? new HashMap<>() : secondMap;
//This contains the List of keys that is required to be filtered out from Json Strings before comparision like {"message", "objects.desc"}
List<String> firstIgnoreList = getIgnoreList1();
List<String> secondIgnoreList = getIgnoreList2();
filterKeys(firstMap, firstIgnoreList);
filterKeys(secondMap, secondIgnoreList);
mapDifference = Maps.difference(firstMap, secondMap);
return mapDifference;
}
private void filterKeys(Map<String, Object> keyMap, List<String> ignoreList) {
if (!(CollectionUtils.isEmpty(keyMap) || CollectionUtils.isEmpty(ignoreList))) {
ignoreList.stream().parallel().forEach(key -> recursiveRemove(keyMap, key));
}
}
private static void recursiveRemove(Map<String, Object> keyMap, String key) {
List<String> path = Arrays.asList(StringUtils.split(key.trim(), "."));
int size = path.size();
int index = 0;
List<LinkedTreeMap> treeMapList = new ArrayList<LinkedTreeMap>();
treeMapList.add((LinkedTreeMap) keyMap);
while (index != size - 1) {
int i = index++;
List<LinkedTreeMap> treeMapListTemp = new ArrayList<LinkedTreeMap>();
treeMapList.stream().parallel().forEach(treeMap -> {
Object obj = treeMap.get(path.get(i));
if (obj instanceof List) {
treeMapListTemp.addAll((List<LinkedTreeMap>) obj);
} else if (obj instanceof LinkedTreeMap) {
treeMapListTemp.add((LinkedTreeMap) obj);
}
});
treeMapList = treeMapListTemp;
}
treeMapList.stream().parallel().forEach(treeMap -> treeMap.remove(path.get(size - 1)));
}