如何在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
}