JSON/JSONB
两种协议,JSONPath
是一等公民。Java
服务端、客户端Android
、大数据场景。Kotlin
JSON Schema
https://alibaba.github.io/fastjson2/json_schema_cnAndroid
Graal Native-Image
在 Spring Web MVC 中集成 Fastjson2
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot-demo</artifactId>
<groupId>com.et</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>fastjson2</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension-spring5</artifactId>
<version>2.0.40</version>
</dependency>
</dependencies>
</project>
FastJsonHttpMessageConverter
来替换 Spring MVC 默认的 HttpMessageConverter
以提高 @RestController
、@ResponseBody
和 @RequestBody
注解的 JSON 序列化和反序列化速度。
配置示例如下:
package com.et.fastjson2.config;
import com.alibaba.fastjson2.JSONReader;
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.Collections;
import java.util.List;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//custom configuration
FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
config.setReaderFeatures(JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean);
config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat);
converter.setFastJsonConfig(config);
converter.setDefaultCharset(StandardCharsets.UTF_8);
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
converters.add(0, converter);
}
}
controller
package com.et.fastjson2.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public Map<String, Object> showHelloWorld(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld");
return map;
}
}
@Test
public void toJSONString() throws ParseException {
UserDTO user = new UserDTO();
BigDecimal money =new BigDecimal(-40090.07d);
money = money.setScale(4, RoundingMode.HALF_UP);
user.setMoney(money);
String createtime ="2024-07-03 09:03:26.968";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = format.parse(createtime);
user.setCreateTime(date);
List<UserDTO> list = new ArrayList<>();
list.add(user);
String json=JSON.toJSONString(list);
System.out.println(json);
}
}
[{"createTime":"2024-07-03","money":-40090.700}]发现没有一个怪异现象:-40090.07 变成了-40090.700,直接查几毛钱,原因是fastjson处理bigdecimal不是吧它当成字符串处理,导致丢失精度
String json=JSON.toJSONString(list, JSONWriter.Feature.WriteBigDecimalAsPlain);
@Test
public void parseArray() {
String json="[{\"create_time\":\"2024-07-03 09:03:26.968\",\"money\":-40090.0700}]";
System.out.println(json);
List<UserDTO> list1 = JSON.parseArray(json, UserDTO.class,JSONReader.Feature.SupportSmartMatch);
System.out.println();
}
java.time.format.DateTimeParseException: Text '2024-07-03 09:03:26.968' could not be parsed, unparsed text found at index 10
UserDTO上加上@JSONField(format= "yyyy-MM-dd HH:mm:ss")
JSONB
格式文档:
https://alibaba.github.io/fastjson2/jsonb_format_cnFASTJSON v2
性能有了很大提升,具体性能数据看这里:
https://alibaba.github.io/fastjson2/benchmark_cn