我有两个复杂的jsons,一个是默认的,另一个是默认的,modifiedDefault说。Json将有嵌套的Jsons和数组。
我使用jsonPatch查找diff,它返回一个差异列表。现在我想将这些更改保存为Json,返回到modifiedDefault文件中。
现在,在get调用中,我希望合并modifiedDefault和default文件,方法是重写modifiedDefault的默认值,然后返回Json。
最初,我决定将从JsonPatch返回的路径和值存储在新文件中,但当我尝试将其与默认文件合并时,路径和值无法工作。
这是一个java字符串引导项目,在找到diffs之后,我被困住了。因为我无法应用并将更改保存为Json返回到modifiedDefault文件中。这也影响到合并问题的一部分。
使用json和json库在javascript中实现这一点非常容易,但是在java中,我非常希望得到一些输入。或者一些资源。因为对于初学者来说,jsonPatch上的大部分资源都不是非常直观的。
投入:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}修改输入
{
"glossary": {
"title": "example glossary",
"location": "dc",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"Acronym": "SGML2",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML"],
"another": ["sj", "pj"]
},
"GlossSee": "markup"
}
}
}
}
}比较
{
"glossary": {
"location": "dc",
"GlossDiv": {
"GlossList": {
"GlossEntry": {
"Acronym": "SGML2",
"GlossDef": {
"GlossSeeAlso": ["GML"],
"another": ["sj", "pj"]
}
}
}
}
}
}合并后
{
"glossary": {
"title": "example glossary",
"location": "dc",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML2",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"],
"another": ["sj", "pj"]
},
"GlossSee": "markup"
}
}
}
}
}我需要将diff保存在modifiedDefault文件中,如果用户想再次进行更改,那么在与diff合并默认之后,我会给他数据。
发布于 2022-08-07 16:00:00
合并这两个对象并将结果写入文件可以很容易地使用ObjectMapper的readerForUpdating方法完成。
public static void merge() throws IOException {
final var objectMapper = new ObjectMapper();
final var obj1 = objectMapper.readValue(
new FileInputStream(<path-to-input-file.json>),
new TypeReference<Map<String, Object>>() {
});
final var updater = objectMapper.readerForUpdating(obj1);
final var merged = updater.readValue(new FileInputStream(<path-to-modified-file.json));
objectMapper.writeValue(new File("merge-result.json"), merged);
}唯一的问题是数组实际上得到了合并的,而不是像您的示例那样被视为集合。因此,合并后的输出为:
{
"glossary": {
"title": "example glossary",
"location": "dc",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML2",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML", "GML"],
"another": ["sj", "pj"]
},
"GlossSee": "markup"
}
}
}
}
}如果这是一个问题,您可以迭代合并对象的对象树,检查数组,并在将其写入结果文件之前删除重复的数组。
发布于 2022-08-13 04:10:41
乔森斯图书馆已经设置了操作。
modifiedInput <-< input从modifiedInput中减去输入以产生JsonNode差异。input <+< diff将差异连接到输入中以生成JsonNode合并。https://github.com/octomix/josson
Jossons jossons = new Jossons();
jossons.putDataset("input", Josson.fromJsonString(
"{" +
" \"glossary\": {" +
" \"title\": \"example glossary\"," +
" \"GlossDiv\": {" +
" \"title\": \"S\"," +
" \"GlossList\": {" +
" \"GlossEntry\": {" +
" \"ID\": \"SGML\"," +
" \"SortAs\": \"SGML\"," +
" \"GlossTerm\": \"Standard Generalized Markup Language\"," +
" \"Acronym\": \"SGML\"," +
" \"Abbrev\": \"ISO 8879:1986\"," +
" \"GlossDef\": {" +
" \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\"," +
" \"GlossSeeAlso\": [\"GML\", \"XML\"]" +
" }," +
" \"GlossSee\": \"markup\"" +
" }" +
" }" +
" }" +
" }" +
"}"));
jossons.putDataset("modifiedInput", Josson.fromJsonString(
"{" +
" \"glossary\": {" +
" \"title\": \"example glossary\"," +
" \"location\": \"dc\"," +
" \"GlossDiv\": {" +
" \"title\": \"S\"," +
" \"GlossList\": {" +
" \"GlossEntry\": {" +
" \"ID\": \"SGML\"," +
" \"Acronym\": \"SGML2\"," +
" \"Abbrev\": \"ISO 8879:1986\"," +
" \"GlossDef\": {" +
" \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\"," +
" \"GlossSeeAlso\": [\"GML\"]," +
" \"another\": [\"sj\", \"pj\"]" +
" }," +
" \"GlossSee\": \"markup\"" +
" }" +
" }" +
" }" +
" }" +
"}"));
JsonNode diff = jossons.evaluateQuery("modifiedInput <-< input");
System.out.println("diff:" + diff.toPrettyString());
jossons.putDataset("diff", Josson.create(diff));
JsonNode merge = jossons.evaluateQuery("input <+< diff");
System.out.println("merge:" + merge.toPrettyString());输出差
diff:
{
"glossary" : {
"location" : "dc",
"GlossDiv" : {
"GlossList" : {
"GlossEntry" : {
"Acronym" : "SGML2",
"GlossDef" : {
"another" : [ "sj", "pj" ]
}
}
}
}
}
}输出合并
merge:
{
"glossary" : {
"title" : "example glossary",
"GlossDiv" : {
"title" : "S",
"GlossList" : {
"GlossEntry" : {
"ID" : "SGML",
"SortAs" : "SGML",
"GlossTerm" : "Standard Generalized Markup Language",
"Acronym" : "SGML2",
"Abbrev" : "ISO 8879:1986",
"GlossDef" : {
"para" : "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso" : [ "GML", "XML" ],
"another" : [ "sj", "pj" ]
},
"GlossSee" : "markup"
}
}
},
"location" : "dc"
}
}https://stackoverflow.com/questions/73260336
复制相似问题