如何在java中更新包含JsonNode的Map中的元素?

时间:2015-09-17 23:28:06

标签: java json jackson fasterxml

以下是json

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

我有基于版本

存储这些jsonNode的map

例如:{"v1": jsonNode@1343, "v2":jsonNOde@1353543}

这是我的方法:

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节点,则使用传递的值

更新它

如果不存在,则创建一个并更新它。

请注意,在示例中有两个mainKeysuserInfoServiceuserProfileService

有一个top-level map维护versionsjsonNode的映射。

在上面的例子中,如果对于给定的版本,如果jsonNode为null,则创建一个并更新它。

如果对于给定版本,存在jsonNode(例如userInfoService)但userProfileService不存在,则更新根以包含userProfileService

如果仅对已存在的userInfoService进行更新,则相应地更新。

1 个答案:

答案 0 :(得分:0)

您需要额外级别的JsonNode(或Map)来存储mainKey-&gt;节点关联。

例如:

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
}