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

如何在java中更新包含JsonNode的映射中的元素?,java,json,jackson,fasterxml,Java,Json,Jackson,Fasterxml,以下是json { "UserInfoService": { "state": "active", "message": [ "hello", "world" ] }, "UserProfileService": { "state": "inactive", "message": "[foo,bar]" } } 我有一个基于版本存储这些

以下是
json

{
    "UserInfoService": {
        "state": "active",
        "message": [
            "hello",
            "world"
        ]
    },
    "UserProfileService": {
        "state": "inactive",
        "message": "[foo,bar]"
    }
}
我有一个基于版本存储这些jsonNode的映射

例如:
{“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

}
公共类修改映射{
私有映射映射=新的HashMap();
私有void updateNode(Foobar foo、字符串版本、列表消息、字符串主键){
JsonNode rootNode=featureStatusNodes.get(版本);
如果(featureNode==null){
rootNode=mapper.createObjectNode();
}
JsonNode stateNode=mapper.convertValue(新状态(foo.getState()),JsonNode.class);
JsonNode messageNode=mapper.convertValue(messages,JsonNode.class);
((ObjectNode)rootNode).set(“state”,stateNode);
((ObjectNode)rootNode).set(“message”,messageNode);
rootNode.put(版本,featureNode);
}
}
公共阶级地位{
字符串状态;
//接球手和接球手
}
公共级FooBar{
地位;
//接球手和接球手
}
这就是我所拥有的

但是如何将传入参数的
main键设置为顶级节点呢。在上面的示例中,
main键将是
userInfoService

<>因素要考虑的是 如果存在
mainKey
节点,则使用传递的值更新它

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

请注意,在示例中有两个
主键
userInfoService
userProfileService

有一个
顶级映射
,它维护
版本
jsonNode的映射

在上述情况下,如果给定版本的jsonNode为null,则创建一个并更新它

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


如果只需要对已经存在的
userInfoService
进行更新,则相应地进行更新。

您需要额外级别的JsonNode(或Map)来存储主键->节点关联

例如:

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 Map=newhashmap();
私有void updateNode(Foobar foo,
字符串版本,
列出消息,
字符串(主键){
Map versionedMap=Map.computeIfAbsent(版本,HashMap::new);
ObjectNode rootNode=versionedMap.computeIfAbsent(主键,映射器::createObjectNode);
//更新根节点
}
或:

Map Map=newhashmap();
私有void updateNode(Foobar foo,
字符串版本,
列出消息,
字符串(主键){
ObjectNode versionedNode=map.computeIfAbsent(版本,mapper::createObjectNode);
ObjectNode rootNode=versionedNode.get(mainKey);
if(rootNode==null){
rootNode=mapper.createObjectNode();
versionedNode.set(主键,根节点);
}
//更新根节点
}
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
}