json和jackson、fastjson2转化
jackson
Spring Boot默认使用的JSON处理库是Jackson。Jackson是一个流行的Java库,用于序列化Java对象为JSON格式,以及将JSON字符串反序列化为Java对象。
实体类
@Data
publicclassUser{
/*
*JsonIgnore会影响java对象转json【json中没有id字段】、json转java对象【java对象的id属性为null】
*/
@JsonIgnore
privateLongid;
/*
*JsonProperty标识对应关系
*/
@JsonProperty("username")
privateStringname;
privateIntegerage;
/*
*JsonFormat会影响java对象转json【json中brithDay字段格式化为:yyyy-MM-ddHH:mm;java对象的brithDay属性类型是Date】
*/
@JsonFormat(timezone="GMT+8",pattern="yyyy-MM-ddHH:mm")
privateDatebrithDay;
}
测试代码
@PostConstruct
publicvoidtestJson()throwsJsonProcessingException{
Useruser=newUser();
user.setId(1L);
user.setName("jei");
user.setAge(25);
user.setBrithDay(newDate());
ObjectMapperobjectMapper=newObjectMapper();
Stringjson=objectMapper.writeValueAsString(user);
System.out.println(json);
StringjsonStr="{\"id\":1,\"username\":\"jei\",\"age\":25,\"brithDay\":\"2025-01-1415:18\"}";
UseruserValue=objectMapper.readValue(jsonStr,User.class);
System.out.println(userValue);
}
结果
fastjson2
Fastjson2并不是在Fastjson1的基础上进行简单的升级,而是进行了重新的编写和优化。这意味着Fastjson2在代码结构、算法实现和性能优化方面都进行了全面的改进。
将jackson换成fastjson2
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去掉Jackson依赖,用fastjson2 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.21</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>2.0.21</version>
</dependency>
</dependencies>
config
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.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.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class FastjsonConfig implements WebMvcConfigurer {
/*
* 配置fastjson输出格式
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1. 配置fastjson
FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
config.setCharset(StandardCharsets.UTF_8);
config.setWriterFeatures(
JSONWriter.Feature.WriteNullListAsEmpty,
//json格式化
JSONWriter.Feature.PrettyFormat,
//输出map中value为null的数据
JSONWriter.Feature.WriteMapNullValue,
//输出boolean 为 false
JSONWriter.Feature.WriteNullBooleanAsFalse,
//输出list 为 []
JSONWriter.Feature.WriteNullListAsEmpty,
//输出number 为 0
JSONWriter.Feature.WriteNullNumberAsZero,
//输出字符串 为 ""
JSONWriter.Feature.WriteNullStringAsEmpty,
//对map进行排序
JSONWriter.Feature.MapSortField
);
// 2. 添加fastjson转换器
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
// 3. 添加支持的媒体类型
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
converter.setSupportedMediaTypes(supportedMediaTypes);
//4 将convert添加到converters
converter.setFastJsonConfig(config);
converters.add(0, converter);
}
}
实体类
@Data
public class User {
/*
* java对象转json:json中没有id字段
* json转java对象不受影响
*/
@JSONField(serialize = false)
private Long id;
/*
* name标识对应关系
*/
@JSONField(name = "username")
private String name;
private Integer age;
/*
* java对象转json:会将brithDay属性转成格式化为:yyyy-MM-dd HH:mm:ss
* json转java对象:brithDay强制要求是"yyyy-MM-dd HH:mm:ss"的字符串
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date brithDay;
}
测试代码
@PostConstruct
public void testFastJson2() {
User user = new User();
user.setId(1L);
user.setName("jei");
user.setAge(25);
user.setBrithDay(new Date());
String json = JSONObject.toJSONString(user);
System.out.println(json);
String jsonStr = "{\"age\":25,\"brithDay\":\"2025-01-14 16:05:11\",\"id\":1,\"username\":\"jei\"}";
User userValue = JSONObject.parseObject(jsonStr, User.class);
System.out.println(userValue);
}