Spring框架中对象转JSON的多种实现方式
在Spring框架中,将对象转换为JSON(JavaScript Object Notation)是日常开发中常见的操作,尤其在RESTful API开发、前后端数据交互等场景中高频出现,Spring生态提供了多种灵活的方式实现对象到JSON的转换,既支持内置的简化方案,也允许集成第三方高性能库,本文将详细介绍Spring中对象转JSON的核心实现方式,包括底层原理、代码示例及适用场景。
Spring Boot内置的Jackson集成:@ResponseBody与HttpMessageConverter
Spring Boot默认集成了Jackson库,并通过HttpMessageConverter机制实现HTTP请求/响应与JSON对象的自动转换,这是Spring中最常用、最便捷的对象转JSON方式。
核心组件:MappingJackson2HttpMessageConverter
Spring Boot在Web模块中默认注册了MappingJackson2HttpMessageConverter,它是HttpMessageConverter接口的实现类,专门负责将Java对象序列化为JSON响应体,或将JSON请求体反序列化为Java对象。
当Controller方法返回一个Java对象,并添加@ResponseBody注解(或使用Spring 4.0+的@RestController复合注解,它已包含@ResponseBody)时,Spring MVC会自动调用MappingJackson2HttpMessageConverter将对象转换为JSON格式并写入HTTP响应。
实现步骤与示例
(1)添加依赖(Spring Boot项目无需手动添加)
Spring Boot Starter Web已默认包含Jackson依赖,若使用传统Spring项目,需手动添加:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
(2)定义实体类
public class User {
private Long id;
private String username;
private Integer age;
private List<String> hobbies;
// 构造方法、getter/setter、toString() 省略
}
(3)Controller层返回对象
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setId(1L);
user.setUsername("张三");
user.setAge(25);
user.setHobbies(Arrays.asList("阅读", "编程", "旅行"));
return user; // Spring自动将User对象转为JSON
}
}
(4)访问接口
启动项目后,访问http://localhost:8080/user,浏览器会返回如下JSON响应:
{
"id": 1,
"username": "张三",
"age": 25,
"hobbies": ["阅读", "编程", "旅行"]
}
Jackson注解定制JSON格式
通过在实体类上添加Jackson注解,可以灵活控制JSON序列化的结果,例如字段命名、忽略字段、日期格式等。
常用注解包括:
@JsonProperty:指定JSON字段名与Java属性的映射关系。@JsonIgnore:忽略该字段,不参与序列化/反序列化。@JsonIgnoreProperties:类级别注解,忽略多个未知字段。@JsonFormat:格式化日期、数字等类型。
示例:
import com.fasterxml.jackson.annotation.*;
import java.util.Date;
@JsonInclude(Include.NON_NULL) // 为null的字段不序列化
public class User {
@JsonProperty("user_id") // 指定JSON字段名
private Long id;
@JsonIgnore // 忽略该字段
private String password;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 日期格式化
private Date createTime;
// getter/setter 省略
}
手动使用Jackson库:ObjectMapper
除了自动转换,Spring应用中也可以手动调用Jackson的ObjectMapper实现对象转JSON,适用于非HTTP响应场景(如本地数据处理、消息发送等)。
核心API:ObjectMapper.writeValueAsString()
ObjectMapper是Jackson的核心类,提供writeValueAsString()方法将对象转为JSON字符串,writeValueAsBytes()转为字节数组,writeValue()直接输出到文件或流。
实现示例
(1)注入或创建ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ManualJsonController {
@GetMapping("/manual-json")
public String manualJson() throws Exception {
// 方式1:直接使用Spring Boot默认配置的ObjectMapper(推荐)
ObjectMapper objectMapper = new ObjectMapper();
// 方式2:手动创建并配置(可自定义配置)
// ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
User user = new User();
user.setId(2L);
user.setUsername("李四");
user.setAge(30);
// 对象转JSON字符串
String jsonStr = objectMapper.writeValueAsString(user);
return jsonStr;
}
}
(2)访问接口
返回结果:
{
"id": 2,
"username": "李四",
"age": 30,
"hobbies": null
}
(注:因配置了@JsonInclude(Include.NON_NULL),hobbies为null未被序列化)
ObjectMapper配置扩展
ObjectMapper支持丰富的配置,可通过configure()方法或链式调用定制行为:
ObjectMapper mapper = new ObjectMapper(); // 忽略未知属性(反序列化时使用) mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 允许将日期转为时间戳(默认开启) mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 启用默认Pretty Print(格式化输出) mapper.enable(SerializationFeature.INDENT_OUTPUT);
集成其他JSON库:Gson与Fastjson
虽然Spring Boot默认使用Jackson,但开发者也可以根据需求集成Gson(Google)或Fastjson(阿里)等第三方JSON库。
集成Gson
(1)添加依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
(2)配置Gson消息转换器
通过实现WebMvcConfigurer注册GsonHttpMessageConverter,覆盖默认的Jackson转换器:
import com.google.gson.Gson;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class GsonConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter();
gsonConverter.setGson(new Gson()); // 可自定义Gson配置
converters.add(gsonConverter);
}
}
(3)Controller中使用
与Jackson方式完全一致,@RestController返回的对象会自动通过Gson转换为JSON。
集成Fastjson
(1)添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version>
</dependency>
(2)配置Fastjson消息转换器
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.http.converter.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class FastJsonConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyPrint, // 格式化输出
SerializerFeature.DisableCircularReferenceDetect // 禁用循环引用检测
);
fastConverter.setFastJsonConfig(fastJsonConfig);
// 设置支持的媒体类型
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
converters.add(fastConverter);
}
}



还没有评论,来说两句吧...