如何使用 jackson fasterxml 克隆经过一些修改的 json 内容

How to clone a json content with some modifications using jackson fasterxml

提问人:Morpheus 提问时间:10/30/2023 更新时间:10/30/2023 访问量:23

问:

假设我们创建一个 json 作为字符串,构造如下;

StringWriter writer = new StringWriter();
final JsonGenerator json = mapper.getFactory().createJsonGenerator(writer);
// construct the content using various json.write* functions
json.flush();
String content = writer.toString();

现在我想将其克隆到另一个 json 中,但进行了一些修改(例如覆盖某些字段)。鉴于以下限制,我该如何实现?content

  1. 上述内容创作极其冗长和复杂
  2. 它不使用架构
  3. 它没有表示每个字段/节点的 Java 对象
  4. 必须保留字段的顺序
java json 杰克逊 fasterxml

评论

0赞 AndrewL 10/30/2023
如果您的内容非常大,字段具有唯一的名称,并且您的修改很简单,则另一种方法是仅将 JSON 视为字符流,并使用库(如 github.com/rwitzel/streamflyer

答:

0赞 Hemant Metalia 10/30/2023 #1

要使用 Jackson FasterXML 克隆 JSON 内容,并进行一些修改,同时保留字段的顺序并考虑到您提到的限制,您可以按照以下步骤操作:

将原始 JSON 内容解析为 JsonNode。 创建一个新的 ObjectNode 进行修改。 将所需的修改应用于新的 ObjectNode。 将修改后的 ObjectNode 序列化回 JSON。

       // Create Jackson ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        // Parse the original JSON content into a JsonNode
        JsonNode originalNode = mapper.readTree(originalJson);

        // Create a new ObjectNode to make modifications
        ObjectNode modifiedNode = mapper.createObjectNode();

        // Copy the original content to the modified node
        originalNode.fields().forEachRemaining(entry -> {
            modifiedNode.set(entry.getKey(), entry.getValue());
        });

        // Apply modifications (override some fields)
        modifiedNode.put("field1", "new_value1");