2017-10-27 5 views
-1

Json Stringは、さらに別のネストされたオブジェクトを持つオブジェクトを表しています。また、私はこのJson Stringから削除する必要があるキーのリストを持っています。これらのキーは、この文字列内のオブジェクトのネストされたレベルにあります。最後に、この編集されたJson文字列を別の文字列と比較し、その違いを出力する必要があります。比較の際にこれらのキーを無視する必要があるので、最初のJson文字列からそれらのキー値ペアを削除する必要があります。現在、私は​​3210で提供されているLinkedTreeMapにJson Stringを変換してから、Map.difference()を比較しています。これに対する解決策を提案してください。LinkedTreeMapを使用してJson Stringからキー値ペア(任意のレベルでネスト)を削除します

答えて

1

フィールドを見つけてそれが存在する場合は削除するまで、ネストされたLinkedTreeMap内を再帰的にトラバースしました。 Keyのフルパス(JSON文字列からDESCを除去するために、以下の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))); 
    } 
関連する問題