什么是JSON,如何与Java对象转化
JSON概念
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON 基于 JavaScript(ECMAScript(欧洲计算机协会制定的js规范)) 编程语言的一个子集,但它是一种独立于语言的数据格式,被广泛应用于各种编程语言和平台之间的数据交换。
JSON 的主要特点:
- 轻量级: JSON 格式非常简洁,只包含必要的数据信息,减少了传输的数据量,提高了数据传输效率。
 - 易于阅读和编写: JSON 的结构清晰,使用键值对的方式组织数据,易于人理解和编写。
 - 易于解析和生成: 各种编程语言都提供了 JSON 解析器和生成器,方便程序处理 JSON 数据。
 - 跨平台、跨语言: JSON 是一种与编程语言无关的数据格式,可以在不同的平台和编程语言之间进行数据交换。
 - 数据结构: JSON 支持两种基本的数据结构:
 
JSON 的数据类型:
- 字符串(String): 用双引号 
\"\"包围的 Unicode 字符序列。 - 数字(Number): 可以是整数或浮点数。
 - 布尔值(Boolean): 
true或false。 - 空值(Null): 
null。 - 对象(Object): 键值对的集合。
 - 数组(Array): 值的有序列表。
 
语法:
- 
数据在 键值对(Key/Value) 中
 - 
数据由逗号 , 分隔
 - 
对象⽤
{}表⽰ - 
数组⽤
[]表⽰ - 
值可以为对象, 也可以为数组, 数组中可以包含多个对象
 
JSON 示例:
{ \"name\": \"张三\", \"age\": 30, \"city\": \"北京\", \"isStudent\": false, \"courses\": [\"语文\", \"数学\", \"英语\"], \"address\": { \"street\": \"XX大街\", \"zipcode\": \"100000\" }}
如何与Java对象进行转化
ObjectMapper 是 Jackson 库中的一个核心类,主要用于在 Java 对象(POJO,Plain Old Java Object)和 JSON 数据之间进行转换。 简单来说,它能帮你把 JSON 字符串变成 Java 对象,也能把 Java 对象变成 JSON 字符串。
ObjectMapper 的主要功能:
- 序列化 (Serialization): 将 Java 对象转换为 JSON 字符串。 这个过程也称为 “marshalling”。
 - 反序列化 (Deserialization): 将 JSON 字符串转换为 Java 对象。 这个过程也称为 “unmarshalling”。
 
为什么需要 ObjectMapper?
- 简化 JSON 处理: 手动解析 JSON 字符串或手动构建 JSON 字符串非常繁琐且容易出错。 
ObjectMapper封装了这些复杂的操作,让你只需要调用几个简单的方法就能完成转换。 - 类型安全: 
ObjectMapper在转换过程中会进行类型检查,确保数据的正确性。 例如,如果你尝试将一个包含字符串的 JSON 字段反序列化为 Java 的int类型,ObjectMapper会抛出异常。 - 配置灵活: 
ObjectMapper提供了丰富的配置选项,可以自定义 JSON 转换的行为,例如日期格式、字段命名策略、忽略未知字段等。 
ObjectMapper 的常用方法:
- 
writeValueAsString(Object value): 将 Java 对象转换为 JSON 字符串。ObjectMapper mapper = new ObjectMapper();MyObject obj = new MyObject(\"张三\", 30);String jsonString = mapper.writeValueAsString(obj);System.out.println(jsonString); // 输出: {\"name\":\"张三\",\"age\":30} - 
readValue(String content, Class valueType): 将 JSON 字符串转换为 Java 对象。ObjectMapper mapper = new ObjectMapper();String jsonString = \"{\\\"name\\\":\\\"李四\\\",\\\"age\\\":25}\";MyObject obj = mapper.readValue(jsonString, MyObject.class);System.out.println(obj.getName()); // 输出: 李四System.out.println(obj.getAge()); // 输出: 25 
易错点:
 ·readValue(String content, TypeReference valueTypeRef): 将 JSON 字符串转换为复杂的泛型类型(如 List 或 Map)。
当你需要将一个 JSON 数组转换为 Java 的 List 集合时,你需要使用 TypeReference 来帮助 Jackson 保留泛型信息。
ObjectMapper mapper = new ObjectMapper();String jsonArrayString = \"[{\\\"name\\\":\\\"张三\\\",\\\"age\\\":30}, {\\\"name\\\":\\\"李四\\\",\\\"age\\\":25}]\";// 错误的做法:mapper.readValue(jsonArrayString, List.class);// 这会导致 List 中的元素被解析为 LinkedHashMap,而不是 MyObject// 正确的做法:使用 TypeReferenceList<MyObject> userList = mapper.readValue(jsonArrayString, new TypeReference<List<MyObject>>() {});System.out.println(userList.get(0).getName()); // 输出: 张三
- 
readTree(String content): 将 JSON 字符串转换为JsonNode对象。JsonNode是 Jackson 库中表示 JSON 树结构的类,可以方便地访问 JSON 数据的各个部分。ObjectMapper mapper = new ObjectMapper();String jsonString = \"{\\\"name\\\":\\\"王五\\\",\\\"age\\\":40}\";JsonNode rootNode = mapper.readTree(jsonString);String name = rootNode.get(\"name\").asText();int age = rootNode.get(\"age\").asInt();System.out.println(name); // 输出: 王五System.out.println(age); // 输出: 40 
使用 ObjectMapper 的步骤:
- 
添加 Jackson 依赖: 在你的项目中添加 Jackson 库的依赖。 如果你使用 Maven,可以在
pom.xml文件中添加以下依赖:(如果是Springboot项目那么其已经内置了,不需要再导入)<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.16.1</version> </dependency> - 
创建 ObjectMapper 对象
 
- 
普通项目:
ObjectMapper mapper = new ObjectMapper(); - 
SpringBoot项目- 正如前文所说,Spring Boot 已经为我们自动配置了一个 ObjectMapper Bean。因此,在 Spring Boot 项目中,我们不应该手动 new ObjectMapper(),而应该通过依赖注入(DI)来使用这个已经配置好的单例对象。
 
 
@Servicepublic class MyService { private final ObjectMapper objectMapper; // 通过构造函数注入(推荐) @Autowired public MyService(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public void doSomething() { // 直接使用注入的 objectMapper 实例 // ... }}
- 调用 ObjectMapper 的方法进行 JSON 转换: 使用 
writeValueAsString()进行序列化,使用readValue()或readTree()进行反序列化。 
ObjectMapper 的高级用法:
- 自定义序列化器和反序列化器: 可以自定义 
JsonSerializer和JsonDeserializer来控制 JSON 转换的细节。 - 使用注解: 可以使用 Jackson 提供的注解 (例如 
@JsonProperty,@JsonIgnore,@JsonFormat) 来配置 JSON 转换的行为。@JsonProperty(\"user_name\"): 用于指定 Java 属性在 JSON 中对应的键名,常用于连接不同的命名风格(如 Java 的驼峰 userName 和 JSON 的下划线 user_name)。@JsonIgnore: 在序列化和反序列化时完全忽略某个属性。@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\"): 用于指定 Date 或 LocalDateTime 等日期类型的格式。
 - 配置 ObjectMapper: 可以通过 
ObjectMapper的配置方法 (例如configure(),setPropertyNamingStrategy()) 来调整 JSON 转换的各种参数。 


