2015-09-17 11 views
0

Вот jsonКак обновить элементы на карте, содержащей JsonNode в java?

{ 
    "UserInfoService": { 
     "state": "active", 
     "message": [ 
      "hello", 
      "world" 
     ] 
    }, 
    "UserProfileService": { 
     "state": "inactive", 
     "message": "[foo,bar]" 
    } 
} 

У меня есть карта, которая хранит это jsonNode основано на версии

например: {"v1": [email protected], "v2":[email protected]}

Вот мой метод:

public class ModifyMap { 

    private Map<String,JsonNode> map = new HashMap<>(); 

    private void updateNode(Foobar foo,String version, List<String> messages, String mainKey){ 
     JsonNode rootNode = featureStatusNodes.get(version); 
     if (featureNode==null){ 
      rootNode=mapper.createObjectNode(); 
     } 
     JsonNode stateNode = mapper.convertValue(new Status(foo.getState()), JsonNode.class); 
     JsonNode messageNode = mapper.convertValue(messages, JsonNode.class); 
     ((ObjectNode) rootNode).set("state",stateNode); 
     ((ObjectNode) rootNode).set("message",messageNode); 
     rootNode.put(version, featureNode); 
    } 
} 

public class Status { 

    String state; 
    //getters and setters 

} 

public class FooBar { 

    Status status; 

    //getters and setters 

} 

Это то, что я иметь.

но как бы установить mainKey, который передается в качестве узла верхнего уровня. В приведенном выше примере mainKey будет userInfoService.

Факторы, которые необходимо учитывать являются , если mainKey узел присутствует, а затем обновить его переданных значений

, если его нет, то создать и обновить его.

Обратите внимание, что в этом примере представлены два mainKeys: userInfoService, userProfileService.

Существует top-level map, который поддерживает versions до jsonNode картирование.

В приведенном выше случае, если для данной версии, если jsonNode имеет значение null, создайте его и обновите.

, если для данной версии, jsonNode (например userInfoService) присутствует, но userProfileService нет, а затем обновить корень, включив в него userProfileService.

Если обновление необходимо только для userInfoService, которое уже присутствует, то обновите его соответствующим образом.

ответ

0

Для хранения ассоциаций mainKey-> node необходим дополнительный уровень JsonNode (или Карта).

Например:

Map<String, Map<String, ObjectNode>> map = new HashMap<>(); 

private void updateNode(Foobar foo, 
         String version, 
         List<String> messages, 
         String mainKey) { 
    Map<String, ObjectNode> versionedMap = map.computeIfAbsent(version, HashMap::new); 
    ObjectNode rootNode = versionedMap.computeIfAbsent(mainKey, mapper::createObjectNode); 
    // update rootNode 
} 

или:

Map<String, ObjectNode> map = new HashMap<>(); 

private void updateNode(Foobar foo, 
         String version, 
         List<String> messages, 
         String mainKey) { 
    ObjectNode versionedNode = map.computeIfAbsent(version, mapper::createObjectNode); 
    ObjectNode rootNode = versionedNode.get(mainKey); 
    if (rootNode == null) { 
     rootNode = mapper.createObjectNode(); 
     versionedNode.set(mainKey, rootNode); 
    } 
    // update rootNode 
}