json(javascript object notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。json数组是其中一种基本结构,它允许存储一个有序的值列表。这些值可以是字符串、数字、布尔值、null、对象或另一个数组。这意味着一个json数组可以包含不同类型的数据,例如:
[
"这是一个字符串",
123,
true,
null,
{ "key": "value" },
[1, 2, 3]
]本教程的目标是构建一个包含纯字符串和JSON对象的混合数组:
[
"Test1",
{
"name": "testName",
"phone": "123456"
}
]在Java中,当我们使用ArrayList
[
{
"name": "testName",
"phone": "123456"
}
]这是因为ArrayList
Jackson是Java中最流行的JSON处理库之一。它提供了多种方式来构建包含混合类型元素的JSON数组。
最直接的方法是使用 List
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.ArrayList;
import java.util.List;
// 示例类定义
class TestClass {
String name;
String phone;
public TestClass(String name, String phone) {
this.name = name;
this.phone = phone;
}
// Jackson需要getter方法来序列化字段
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
}
public class JacksonMixedArrayExample {
public static void main(String[] args) throws JsonProcessingException {
// 创建TestClass实例
TestClass testObject = new TestClass("testName", "123456");
// 使用List来存储混合类型
List mixedList = new ArrayList<>();
mixedList.add("Test1"); // 添加字符串
mixedList.add(testObject); // 添加TestClass对象
// 使用ObjectMapper进行序列化
ObjectMapper mapper = new ObjectMapper();
String jsonOutput = mapper.writeValueAsString(mixedList);
System.out.println(jsonOutput);
// 预期输出: ["Test1",{"name":"testName","phone":"123456"}]
}
} 解释: 当ObjectMapper遇到List
Jackson的JsonNode API提供了一种更低级别、更灵活的方式来构建JSON结构,特别是当你需要动态地构建复杂JSON时。ArrayNode是JsonNode的一个子类,专门用于表示JSON数组。
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.core.JsonProcessingException; // TestClass定义同上 public class JacksonArrayNodeExample { public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); // 创建一个ArrayNode作为JSON数组的根 ArrayNode rootArray = mapper.createArrayNode(); // 添加字符串元素 rootArray.add("Test1"); // 创建一个ObjectNode来表示TestClass对象 ObjectNode testObjectNode = mapper.createObjectNode(); testObjectNode.put("name", "testName"); testObjectNode.put("phone", "123456"); // 将ObjectNode添加到ArrayNode中 rootArray.add(testObjectNode); // 将ArrayNode转换为JSON字符串 String jsonOutput = mapper.writeValueAsString(rootArray); System.out.println(jsonOutput); // 预期输出: ["Test1",{"name":"testName","phone":"123456"}] } }
解释: ArrayNode和ObjectNode允许你以编程方式构建JSON树结构。add()方法根据传入的类型自动将值添加到数组中。这种方法在处理非常动态或复杂,无法简单映射到Java对象结构的JSON时特别有用。
Gson是Google提供的JSON处理库,也广泛应用于Java项目。它同样可以通过List
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.ArrayList;
import java.util.List;
// TestClass定义同上
// 注意:Gson不需要getter方法,但为了与Jackson兼容,保留也无妨。
// 如果没有getter,Gson会直接访问字段(需要字段可见性,如public或使用FieldNamingStrategy)。
// 通常推荐使用getter/setter或public字段。
public class GsonMixedArrayExample {
public static void main(String[] args) {
// 创建TestClass实例
TestClass testObject = new TestClass("testName", "123456");
// 使用List来存储混合类型
List mixedList = new ArrayList<>();
mixedList.add("Test1"); // 添加字符串
mixedList.add(testObject); // 添加TestClass对象
// 使用Gson进行序列化
Gson gson = new GsonBuilder().setPrettyPrinting().create(); // setPrettyPrinting()用于美化输出
String jsonOutput = gson.toJson(mixedList);
System.out.println(jsonOutput);
// 预期输出:
// [
// "Test1",
// {
// "name": "testName",
// "phone": "123456"
// }
// ]
}
} 解释: 与Jackson类似,当Gson遇到List
在Java中构建包含字符串和JSON对象的混合数组,可以通过使用主流JSON库(如Jackson和Gson)的List