2017-10-27 12 views
-1

Json String은 더 중첩 된 다른 객체가있는 객체를 나타냅니다. 또한, 내가이 Json String에서 제거해야하는 키 목록이 있습니다. 이 키는이 문자열 안에있는 객체의 중첩 된 레벨에있을 수 있습니다. 마지막으로이 편집 된 Json 문자열을 다른 문자열과 비교하여 차이점을 출력해야합니다. 비교할 때 키를 무시해야하기 때문에 첫 번째 Json 문자열에서 해당 키 - 값 쌍을 제거해야합니다. 현재, 나는 Json String을 Gson API에서 제공되는 LinkedTreeMap으로 변환 한 다음 Map.difference()을 비교합니다. 이에 대한 해결책을 제안하십시오.LinkedTreeMap을 사용하여 Json String에서 키 - 값 쌍 (모든 수준에서 중첩)을 제거합니다.

답변

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))); 
    }