如何在java中将两个json字符串合并为一个
如果我们已经给出了2个json类型的字符串,我们如何在java中将它们合并成单个json字符串如何在java中将两个json字符串合并为一个,java,json,Java,Json,如果我们已经给出了2个json类型的字符串,我们如何在java中将它们合并成单个json字符串 e.g. String json1 = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S" } } } String json2 = {
e.g.
String json1 = {
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S"
}
}
}
String json2 = {
"glossary": {
"title": "person name",
"age": "25"
}
}
应该产生
String mergedJson = {
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S"
},
"age": "25"
}
}
下面的代码应该可以做到这一点,但有几个假设:
- 您正在使用Jackson库的ObjectMapper(
)来序列化/反序列化jsoncom.fasterxml.Jackson.databind.ObjectMapper
- 合并时,json1的字段将始终覆盖json2
ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map1 = mapper.readValue("json1", Map.class); Map<String, Object> map2 = mapper.readValue("json2", Map.class); Map<String, Object> merged = new HashMap<String, Object>(map2); merged.putAll(map1); System.out.println(mapper.writeValueAsString(merged));
ObjectMapper mapper=new ObjectMapper(); Map map1=mapper.readValue(“json1”,Map.class); Map map2=mapper.readValue(“json2”,Map.class); Map merged=新的HashMap(map2); 合并。putAll(map1); System.out.println(mapper.writeValueAsString(合并));
- 下面是递归合并两个JSON的代码。除此之外,这将输出:
private static JsonObject merge(JsonObject json1Obj, JsonObject json2Obj) {
Set<Entry<String, JsonElement>> entrySet1 = json1Obj.entrySet();
for (Entry<String, JsonElement> entry : entrySet1) {
String key1 = entry.getKey();
if (json2Obj.get(key1) != null) {
JsonElement tempEle2 = json2Obj.get(key1);
JsonElement tempEle1 = entry.getValue();
if (tempEle2.isJsonObject() && tempEle1.isJsonObject()) {
JsonObject mergedObj = merge(tempEle1.getAsJsonObject(),
tempEle2.getAsJsonObject());
entry.setValue(mergedObj);
}
}
}
Set<Entry<String, JsonElement>> entrySet2 = json2Obj.entrySet();
for (Entry<String, JsonElement> entry : entrySet2) {
String key2 = entry.getKey();
if (json1Obj.get(key2) == null) {
json1Obj.add(key2, entry.getValue());
}
}
return json1Obj;
}
私有静态JsonObject合并(JsonObject JSON1Object、JsonObject JSON2Object){
Set entrySet1=json1Obj.entrySet();
for(条目:entrySet1){
字符串key1=entry.getKey();
if(json2Obj.get(key1)!=null){
JsonElement tempEle2=json2Obj.get(键1);
JsonElement tempEle1=entry.getValue();
if(tempEle2.isJsonObject()和&tempEle1.isJsonObject()){
JsonObject mergedObj=merge(tempEle1.getAsJsonObject(),
tempEle2.getAsJsonObject());
entry.setValue(mergedObj);
}
}
}
Set entrySet2=json2Obj.entrySet();
for(条目:entrySet2){
字符串key2=entry.getKey();
if(json1Obj.get(key2)==null){
json1Obj.add(key2,entry.getValue());
}
}
返回json1Obj;
}
所以我来晚了,但如果有人无意中发现了这个问题,我想与大家分享我的解决方案。
您可以使用com.fasterxml.jackson.core:jackson-databind
ObjectMapper.readerforupdatening()
深入合并两个json字符串
在此场景中,您将两个Json作为字符串传递,并通过ReaderForUpdate(未测试的代码)将它们合并:
我使用类似的代码将属性合并到现有数据集中。在本例中,SomeProperties
类包含一个hashmap,它保存特定用户的属性。传入的propertiesString
是单点分隔的属性,例如some.random.property=value
。属性将通过com.fasterxml.jackson.dataformat:jackson-dataformat属性转换为JsonNode
public SomeProperties mergeProperties(SomeProperties someProperties, String propertiesString) {
JavaPropsMapper javaPropsMapper = new JavaPropsMapper();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = javaPropsMapper.readTree(propertiesString);
ObjectReader objectReader = mapper.readerForUpdating(someProperties.getProperties());
HashMap<String, Object> mergedProperties = objectReader.readValue(jsonNode);
someProperties.setProperties(mergedProperties);
return someProperties;
}
public SomeProperties合并属性(SomeProperties SomeProperties,String properties String){
JavaPropsMapper JavaPropsMapper=新的JavaPropsMapper();
ObjectMapper ObjectMapper=新的ObjectMapper();
JsonNode-JsonNode=javaPropsMapper.readTree(propertiesString);
ObjectReader=mapper.reader用于更新(someProperties.getProperties());
HashMap mergedProperties=objectReader.readValue(jsonNode);
setProperties(合并属性);
返回一些属性;
}
在这两种情况下,传递到objectReader.readValue()
的所有内容都将覆盖现有键。没有内置的功能。取2个节点,在节点a的子节点上循环,看看它们是否也存在于节点b中。如果是,则递归合并它们。然后在节点b的其余节点上循环。这将为您提供一个合并的节点c。重新绘制title
的条件是什么?您应该手动将JSON转换为术语表对象,并在您将编写的复制方法中应用所需的规则。这样做会更安全、更干净,但这也不例外。这将产生:{“glossary”:{“title”:“example glossary”,“GlossDiv”:{“title”:“S”}}
我将编写自己的java代码,按照@agilob的指示手动执行
public SomeProperties mergeProperties(SomeProperties someProperties, String propertiesString) {
JavaPropsMapper javaPropsMapper = new JavaPropsMapper();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = javaPropsMapper.readTree(propertiesString);
ObjectReader objectReader = mapper.readerForUpdating(someProperties.getProperties());
HashMap<String, Object> mergedProperties = objectReader.readValue(jsonNode);
someProperties.setProperties(mergedProperties);
return someProperties;
}