首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找Json,然后保存在新文件中,然后在get调用返回json合并的newFile与原始文件

查找Json,然后保存在新文件中,然后在get调用返回json合并的newFile与原始文件
EN

Stack Overflow用户
提问于 2022-08-06 13:51:12
回答 2查看 129关注 0票数 0

我有两个复杂的jsons,一个是默认的,另一个是默认的,modifiedDefault说。Json将有嵌套的Jsons和数组。

我使用jsonPatch查找diff,它返回一个差异列表。现在我想将这些更改保存为Json,返回到modifiedDefault文件中。

现在,在get调用中,我希望合并modifiedDefault和default文件,方法是重写modifiedDefault的默认值,然后返回Json。

最初,我决定将从JsonPatch返回的路径和值存储在新文件中,但当我尝试将其与默认文件合并时,路径和值无法工作。

这是一个java字符串引导项目,在找到diffs之后,我被困住了。因为我无法应用并将更改保存为Json返回到modifiedDefault文件中。这也影响到合并问题的一部分。

使用json和json库在javascript中实现这一点非常容易,但是在java中,我非常希望得到一些输入。或者一些资源。因为对于初学者来说,jsonPatch上的大部分资源都不是非常直观的。

投入:

代码语言:javascript
复制
{
    "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"
                }
            }
        }
    }
}

修改输入

代码语言:javascript
复制
{
    "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"
                }
            }
        }
    }
}

比较

代码语言:javascript
复制
{
    "glossary": {
        "location": "dc",
        "GlossDiv": {
            "GlossList": {
                "GlossEntry": {
                    "Acronym": "SGML2",
                    "GlossDef": {
                        "GlossSeeAlso": ["GML"],
                        "another": ["sj", "pj"]
                    }
                }
            }
        }
    }
}

合并后

代码语言:javascript
复制
{
    "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合并默认之后,我会给他数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-07 16:00:00

合并这两个对象并将结果写入文件可以很容易地使用ObjectMapperreaderForUpdating方法完成。

代码语言:javascript
复制
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);
    }

唯一的问题是数组实际上得到了合并的,而不是像您的示例那样被视为集合。因此,合并后的输出为:

代码语言:javascript
复制
{
    "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"
                }
            }
        }
    }
}

如果这是一个问题,您可以迭代合并对象的对象树,检查数组,并在将其写入结果文件之前删除重复的数组。

票数 1
EN

Stack Overflow用户

发布于 2022-08-13 04:10:41

乔森斯图书馆已经设置了操作。

  1. 将输入和modifiedInput反序列化为Josson对象,并放入Josson对象。
  2. 使用查询语句modifiedInput <-< input从modifiedInput中减去输入以产生JsonNode差异。
  3. 将结果差异放入Jossons对象中。
  4. 使用查询input <+< diff将差异连接到输入中以生成JsonNode合并。

https://github.com/octomix/josson

代码语言:javascript
复制
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());

输出差

代码语言:javascript
复制
diff:
{
  "glossary" : {
    "location" : "dc",
    "GlossDiv" : {
      "GlossList" : {
        "GlossEntry" : {
          "Acronym" : "SGML2",
          "GlossDef" : {
            "another" : [ "sj", "pj" ]
          }
        }
      }
    }
  }
}

输出合并

代码语言:javascript
复制
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"
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73260336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档