1.引入POM
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
2.核心API
序列化
String json=Json.toJSONString(XX,true);
反序列化
// json转换为对象格式
XXX对象 json=Json.parseObject(json数据,转换对象的class对象)
// json转换为数组格式
/**
* @param String text-转换的json字符串
* @param Class<T> clazz-集合转换后泛型的class对象
*/
List<User> user = JSON.parseArray(json, User.class);
// 直接反序列化成为map集合,map集合的没有泛型,否则就会报错
Map map = JSON.parseObject(json);
// 直接进反序列化,map集合是没有泛型的,没有泛型的集合是不安全的集合
// 转换后的集合必须有泛型
// 调用parseObject,传递参数,TypeRefernces类型,在TypeReference的泛型中,传递转换后的map集合
Map<String, User> map = JSON.parseObject(json, new TypeReference<Map<String, User>>() {
});
3,案例Demo
3.1序列化操作
3.1.1Object转换为JSON
/**
* 描述:object2 json
*/
@Test
public void object2JSON() {
User user = new User();
user.setId("1");
user.setUsername("茅斐宇");
user.setAge(0);
user.setBirthday(LocalDateTime.now());
user.setTime(new Date());
user.setEmail("157@qq.com");
// 利用fastjson将user进行序列化成为json字符串
String json = JSON.toJSONString(user, true);
System.out.println(json);
}
3.1.2集合转换为JSON
list集合中的一个对象为数组中的一个对象
/**
* 描述:List集合转换成为json
*/
@Test
public void list2JSON() {
ArrayList<User> list = new ArrayList<>();
User user = new User();
user.setId("1");
user.setUsername("茅斐宇");
user.setAge(0);
user.setBirthday(LocalDateTime.now());
user.setTime(new Date());
user.setEmail("157@qq.com");
User user2 = new User();
user2.setId("22222");
user2.setUsername("茅斐12312宇");
user2.setAge(0);
user2.setBirthday(LocalDateTime.now());
user2.setTime(new Date());
user2.setEmail("13123132157@qq.com");
list.add(user2);
list.add(user);
// 转JSON
String json = JSON.toJSONString(list, true);
System.out.println(json);
}
2.2.3Map转换为JSON
转换后,map的key当做我们json的key
/**
* 描述:map集合转换成为json
*/
@Test
public void map2JSON() {
HashMap<String, User> map = new HashMap<>();
User user = new User();
user.setId("1");
user.setUsername("茅斐宇");
user.setAge(0);
user.setBirthday(LocalDateTime.now());
user.setTime(new Date());
user.setEmail("157@qq.com");
User user2 = new User();
user2.setId("22222");
user2.setUsername("茅斐12312宇");
user2.setAge(0);
user2.setBirthday(LocalDateTime.now());
user2.setTime(new Date());
user2.setEmail("13123132157@qq.com");
map.put("one", user);
map.put("two", user2);
// 转JSON
String json = JSON.toJSONString(map, true);
System.out.println(json);
}
3.2反序列化操作
3.2.1JSON转换为对象
@Test
public void json2Object() throws Exception {
String json = "{\n" +
"\t\"age\":0,\n" +
"\t\"birthday\":\"2022-03-15T08:23:49.941\",\n" +
"\t\"email\":\"157@qq.com\",\n" +
"\t\"id\":\"1\",\n" +
"\t\"time\":1647303829941,\n" +
"\t\"username\":\"茅斐宇\"\n" +
"}";
User user = JSON.parseObject(json, User.class);
System.out.println(user);
}
3.2.2JSON转换为List
@Test
public void json2List() throws Exception {
String json = "[\n" +
"\t{\n" +
"\t\t\"age\":0,\n" +
"\t\t\"birthday\":\"2022-03-15T08:25:09.826\",\n" +
"\t\t\"email\":\"13123132157@qq.com\",\n" +
"\t\t\"id\":\"22222\",\n" +
"\t\t\"time\":1647303909826,\n" +
"\t\t\"username\":\"茅斐12312宇\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"age\":0,\n" +
"\t\t\"birthday\":\"2022-03-15T08:25:09.824\",\n" +
"\t\t\"email\":\"157@qq.com\",\n" +
"\t\t\"id\":\"1\",\n" +
"\t\t\"time\":1647303909826,\n" +
"\t\t\"username\":\"茅斐宇\"\n" +
"\t}\n" +
"]";
/**
* @param String text-转换的json字符串
* @param Class<T> clazz-集合转换后泛型的class对象
*/
List<User> user = JSON.parseArray(json, User.class);
System.out.println(user);
user.stream().forEach(System.out::println);
}
2.3.3JSON转换为Map<String,XXX>
@Test
public void json2Map() {
String json = "{\n" +
"\t\"one\":{\n" +
"\t\t\"age\":0,\n" +
"\t\t\"birthday\":\"2022-03-15T08:35:39.091\",\n" +
"\t\t\"email\":\"157@qq.com\",\n" +
"\t\t\"id\":\"1\",\n" +
"\t\t\"time\":1647304539091,\n" +
"\t\t\"username\":\"茅斐宇\"\n" +
"\t},\n" +
"\t\"two\":{\n" +
"\t\t\"age\":0,\n" +
"\t\t\"birthday\":\"2022-03-15T08:35:39.091\",\n" +
"\t\t\"email\":\"13123132157@qq.com\",\n" +
"\t\t\"id\":\"22222\",\n" +
"\t\t\"time\":1647304539091,\n" +
"\t\t\"username\":\"茅斐12312宇\"\n" +
"\t}\n" +
"}\n";
// 直接进反序列化,map集合是没有泛型的,没有泛型的集合是不安全的集合
// 转换后的集合必须有泛型
// 调用parseObject,传递参数,TypeRefernces类型,在TypeReference的泛型中,传递转换后的map集合
Map<String, User> map = JSON.parseObject(json, new TypeReference<Map<String, User>>() {
});
System.out.println(map);
}
4.SerializerFeature枚举
Fastjson默认不会序列化空值得属性,我们 可以在方法参数上添加枚举的类型,来进行序列化操作(默认值为null)
SerializerFeature.WriteMapNullValue 默认使用null进行赋值
SerializerFeature.WriteNullStringAsEmpty 默认使用""进行赋值
SerializerFeature.WriteNullNumberAsZero 默认将null序列化为0
SerializerFeature.WriteNullBooleanAsFalse 默认boolen为null,序列化为false
SerializerFeature.WriteDateUseDateFormat 日期格式化
SerializerFeature.PrettyFormat 格式化json字符串
/**
* SerializerFeature 枚举:进行序列化时,可以自己定义特殊的需求
* JSON静态方法,toJSONString()
* 方法的参数:第一个要序列化的对象
* 方法的参数:第二个参数SerializerFeature枚举类型的可变参数
* SerializerFeature枚举的敞亮,做序列化的个性需求
*/
/**
* fastjson默认不会序列化空值
*/
@Test
public void test() {
User user = new User();
user.setId("");
user.setAge(0);
user.setBirthday(LocalDateTime.now());
user.setEmail("");
// 在方法的参数上,添加枚举类型SerializerFeature.WriteMapNullValue
String s = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);
System.out.println(s);
}
5.FastJson注解
5.1@JSONField注解
该注解作用于方法,字段和参数上,可以在序列化和反序列时进行特性功能定制
- name:序列化后的名字
- ordinal:序列化后的顺序(默认0,越小制度啦越靠前)
- format:序列化后的格式
- serialize:是否序列化该字段
- deserialilze:是否反序列化该字段
- serialzeFeature:序列化的特性定义(同上)
@JSONField(name = "id", ordinal = 0, format = "yyyy-MM-dd", serialize = true, deserialize = true)
5.2@JSONType注解
该注解作用于类上,对该字段进行序列化和反序列化的特性功能定制
- indudes:要被序列化的字段
- orders:序列化后的顺序
- serialzeFeatures:序列化的特性定义
@JSONType(includes = {"id", "name", "age"},orders = {"id", "name"})
6.SpringBoot整合FastJson
6.1排除Jackson依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-json</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
6.2添加Fastjson依赖
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
6.3配置Fastjson
6.3.1方式1:注入bean
/**
* 描述:
* 覆盖方法configureMessageConverters,使用fastJson
*
* @return {@link HttpMessageConverters }
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
// 设置编码字符集
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
//3.解决乱码问题。定义响应的MIME类型,设置响应的content-type为application/json;charset=UTF-8
List<MediaType> fastMediaType = new ArrayList<>();
fastMediaType.add(MediaType.APPLICATION_JSON_UTF8);
//4、将convert添加到converters中
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
6.3.2方式2:重写configureMessageConverters()
方法
启动类实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口
重写public void configureMessageConverters(List<HttpMessageConverter<?>> converters)方法
/**
* 描述:配置消息转换器
* 1.json序列化美化
* 2.设置编码集为UTF-8
*
* @param converters 转换器
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
// 设置序列化美化
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 设置编码字符集
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//3.解决乱码问题。定义响应的MIME类型,设置响应的content-type为application/json;charset=UTF-8
List<MediaType> fastMediaType = new ArrayList<>();
fastMediaType.add(MediaType.APPLICATION_JSON_UTF8);
//4.converter消息转换器添加配置信息
fastConverter.setSupportedMediaTypes(fastMediaType);
//4、将convert添加到converters中
converters.add(fastConverter);
}