You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现未知结构JSON的读取与更新(含数组字段)求助

Java处理未知结构JSON的读取与更新方案

对于未知结构的JSON,提前定义POJO类显然行不通,而普通的JSONObject(比如org.json包下的)在处理数组嵌套时不够灵活。推荐使用Jackson库的树形节点API(ObjectNode和ArrayNode),它可以动态遍历、修改JSON的任意节点,且能完全保留原结构。

步骤1:引入Jackson依赖

如果用Maven,在pom.xml中添加:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新稳定版即可 -->
</dependency>

步骤2:完整代码示例

以下代码针对你给出的示例JSON,实现:

  • 更新顶层的Empid字段
  • 更新数组Emparray中指定位置的role字段
  • 输出保持原结构的JSON
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class DynamicJsonUpdate {
    public static void main(String[] args) throws Exception {
        // 示例JSON字符串
        String jsonStr = "{ \"Empid\" : \"1235\", \"name\": \"steve\", \"Emparray\": [{ \"role\": \"ASP\", \"Date\": \"220122\" },{\"role\": \"JSP\", \"Date\": \"230122\"}] }";

        // 初始化Jackson核心工具类
        ObjectMapper objectMapper = new ObjectMapper();

        // 把JSON字符串解析为可修改的顶层对象节点
        ObjectNode rootNode = (ObjectNode) objectMapper.readTree(jsonStr);

        // 1. 更新顶层字段:修改Empid为"4567"
        rootNode.put("Empid", "4567");

        // 2. 更新数组中的指定字段:修改Emparray里第二个元素(索引1)的role为"SpringBoot"
        ArrayNode empArrayNode = (ArrayNode) rootNode.get("Emparray");
        ObjectNode secondEmpNode = (ObjectNode) empArrayNode.get(1);
        secondEmpNode.put("role", "SpringBoot");

        // 可选:批量修改数组中符合条件的元素(比如把所有role为"ASP"的改成"ASP.NET")
        for (JsonNode node : empArrayNode) {
            if ("ASP".equals(node.get("role").asText())) {
                ((ObjectNode) node).put("role", "ASP.NET");
            }
        }

        // 输出更新后的JSON,保持原结构(格式化输出方便查看)
        String updatedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
        System.out.println(updatedJson);
    }
}

代码说明

  • ObjectNode:代表JSON对象节点,可通过put()、get()直接操作顶层字段,支持动态增删改。
  • ArrayNode:代表JSON数组节点,可通过索引访问元素,也可遍历所有元素进行批量修改。
  • 无论JSON结构多复杂,只要能定位到目标节点(对象或数组),就能直接修改对应字段,完全不需要提前定义POJO。
  • writerWithDefaultPrettyPrinter()用于格式化输出,去掉后会输出紧凑格式,不影响JSON结构的正确性。

运行结果

执行后输出的JSON为:

{
  "Empid" : "4567",
  "name" : "steve",
  "Emparray" : [ {
    "role" : "ASP.NET",
    "Date" : "220122"
  }, {
    "role" : "SpringBoot",
    "Date" : "230122"
  } ]
}

内容的提问来源于stack exchange,提问作者Sakthivel Janarthanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:06:40