1. 引言

在现代软件开发中,JSON数据的处理和更新是家常便饭。JSON(JavaScript Object Notation)作为应用间数据交换的标准格式,经常需要动态修改其数组内容。

本文将深入探讨使用三种主流Java库更新JSON数组值的方法:

  • org.json(包含JSONArray类)
  • Google Gson
  • Jackson

✅ 每种方案都包含创建、验证和更新操作的完整示例
⚠️ 注意:所有示例代码均经过实际测试验证

2. 使用 org.json 库

org.json库提供了最直观的JSON操作方式,我们先从创建和验证JSON数组开始:

@Test
public void givenJSONArray_whenUsingOrgJson_thenArrayCreatedAndVerified() {
    JSONArray jsonArray = new JSONArray().put("Apple").put("Banana").put("Cherry");

    assertEquals("[\"Apple\",\"Banana\",\"Cherry\"]", jsonArray.toString());
}

这个示例展示了:

  1. 创建JSONArray实例
  2. 通过put()方法添加三个元素
  3. 验证输出是否符合预期

接下来演示读取和更新现有JSON数组:

@Test
public void givenJSONArray_whenUsingOrgJson_thenArrayReadAndUpdated() {
    JSONArray jsonArray = new JSONArray("[\"Apple\",\"Banana\",\"Cherry\"]");

    jsonArray.put(1, "Blueberry");
    assertEquals("[\"Apple\",\"Blueberry\",\"Cherry\"]", jsonArray.toString());
}

关键操作说明:

  • 直接从字符串解析创建JSONArray
  • 使用put(index, value)更新指定位置元素
  • 将索引1的"Banana"替换为"Blueberry"

3. 使用 Google Gson 库

Google Gson提供了更丰富的JSON处理功能。首先创建JSON数组:

@Test
public void givenJsonArray_whenUsingGson_thenArrayCreatedAndVerified() {
    JsonArray jsonArray = new JsonArray();
    jsonArray.add(new JsonPrimitive("Apple"));
    jsonArray.add(new JsonPrimitive("Banana"));
    jsonArray.add(new JsonPrimitive("Cherry"));

    assertEquals("[\"Apple\",\"Banana\",\"Cherry\"]", jsonArray.toString());
}

⚠️ 重要注意事项:

  • 必须使用JsonPrimitive包装原始值
  • 因为JsonArray.add()要求JsonElement类型参数
  • JsonPrimitiveJsonElement的子类

更新操作示例:

@Test
public void givenJsonArray_whenUsingGson_thenArrayReadAndUpdated() {
    JsonArray jsonArray = JsonParser.parseString("[\"Apple\",\"Banana\",\"Cherry\"]")
      .getAsJsonArray();

    jsonArray.set(1, new JsonPrimitive("Blueberry"));
    assertEquals("[\"Apple\",\"Blueberry\",\"Cherry\"]", jsonArray.toString());
}

操作步骤:

  1. 使用JsonParser解析字符串
  2. 通过getAsJsonArray()获取数组对象
  3. 使用set(index, element)更新值
  4. 新值同样需要JsonPrimitive包装

4. 使用 Jackson 库

Jackson作为Java生态中最强大的JSON处理库,提供了更灵活的操作方式。创建数组示例:

@Test
public void givenArrayNode_whenUsingJackson_thenArrayCreatedAndVerified() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    ArrayNode arrayNode = mapper.createArrayNode().add("Apple").add("Banana").add("Cherry");

    assertEquals("[\"Apple\",\"Banana\",\"Cherry\"]", arrayNode.toString());
}

优势体现:

  • ArrayNode.add()方法直接接受字符串类型
  • 无需手动包装原始值
  • 链式调用更简洁

更新操作示例:

@Test
public void givenArrayNode_whenUsingJackson_thenArrayReadAndUpdated() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    ArrayNode arrayNode = (ArrayNode) mapper.readTree("[\"Apple\",\"Banana\",\"Cherry\"]");

    arrayNode.set(1, "Blueberry");
    assertEquals("[\"Apple\",\"Blueberry\",\"Cherry\"]", arrayNode.toString());
}

核心特点:

  • readTree()方法直接解析为ArrayNode
  • set()方法接受原始字符串
  • ✅ Jackson内部自动转换为TextNode

5. 结论

在Java中更新JSON数组值时,三种主流库各具特色:

优势 适用场景
org.json API最简单直接 轻量级需求
Gson 类型安全严格 复杂对象映射
Jackson 性能最优功能最全 企业级应用

💡 选择建议:

  • 简单场景:org.json足够用
  • 需要严格类型检查:选Gson
  • 高性能或复杂处理:Jackson是首选

所有示例代码的完整实现可在GitHub仓库获取,包含详细测试用例。


原始标题:Updating Values in JSONArray | Baeldung