1. JSON回顾
1.1 JSON数据格式
JSON数组格式:中括号包裹,中间可以是任何数据类型,逗号分隔;[1,2,true,"lichenglin"]
JSON对象格式:大括号包裹,键值对形式,键必须为字符串类型,值可以是任何数据类型;每个键值对之间使用逗号分隔;["k1":"v1","k2":"v2"];
1.2 JSON数据嵌套
1). JSON数组的元素是对象;[{"k1":"v1","k2":"v2"},{"k1":"v1","k2":"v2"}];
2). JSON对象的值是数组;{“k1”:"v1","k2":["v2-1","v2-2"]};
3). 相互嵌套:{"k1":"v1","k2":[{"x1":"v1"},{"x2":"v2"}]}
2. FastJson
FastJson是Alibaba开源的JSON解析库,支持JSON序列化(将JavaBean序列化为JSON字符串)、JSON反序列化(将JSON字符串反序列化为JavaBean);
FastJson优点:速度快、使用广泛、测试完备、使用简单、功能完备;
3. FastJson序列化API
1). toJsonString(Object obj);
// Java对象/List集合对象/Map集合对象,序列化为Json格式字符串; @Test public void test1(){ Student student = new Student(); student.setId(1); student.setAge(20); student.setName("zhangsan"); student.setEmail("zhangsan@126.com"); String s = JSON.toJSONString(student); System.out.println(s); }
2). parseObject(String url,Class clazz);
// JSON字符串反序列化为Java对象; @Test public void test3(){ String str ="{\"age\":20,\"email\":\"zhangsan@126.com\",\"id\":1,\"name\":\"zhangsan\"}"; Student student = JSON.parseObject(str,Student.class); System.out.println(student); }
3). parseArray(String url, Class clazz);
// JSON字符串反序列化为List集合对象; @Test public void test4(){ String str ="[{\"age\":20,\"email\":\"zhangsan@126.com\",\"id\":1,\"name\":\"zhangsan\"}]"; List<Student> list = JSON.parseArray(str, Student.class); System.out.println(list); }
4). parseObject(String url, TypeReference typeReference);
// JSON字符串反序列化为Map集合对象; @Test public void test5(){ String str ="{\"student1\":{\"age\":20,\"email\":\"zhangsan@126.com\",\"id\":1,\"name\":\"zhangsan\"}"; // 传递参数TypeReference类型,在TypeReference类的泛型中,传递转后的Map集合; Map<String,Student> map = JSON.parseObject(str, new TypeReference<Map<String,Student>>(){}); for(Map.Entry<String,Student> entry:map.entrySet()){ System.out.println(entry.getKey()); System.out.println(entry.getValue()); } }
4. SerializerFeature
进行序列化时,可以自定义需求;
1). WriteMapNullValue:枚举中的常量,序列化null值的字段;
@Test public void testWriteMapNullValue(){ Student student = new Student(2,"lichenglin",null,null); // 方法参数上添加枚举类型,可以让null值字段序列化输出; String s = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue); System.out.println(s); }
2). WriteNullStringAsEmpty:枚举中的常量,序列化null的字符串字段,值序列化为"";
@Test public void testWriteNullStringAsEmpty(){ Student student = new Student(2,"lichenglin",null,null); // 方法参数上添加枚举类型,可以让null值字符串字段序列化输出为”“; String s = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteMapNullValue); System.out.println(s); }
3). WriteNullNumberAsZero:枚举中的常量,序列化null的Number字段,值序列化为0;
@Test public void testWriteNullNumberAsZero(){ Student student = new Student(2,"lichenglin",null,null); // 方法参数上添加枚举类型,可以让null值Number字段序列化输出为0; String s = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero); System.out.println(s); }
4). WriteNullBooleanAsFalse:枚举中的常量,序列化null的Boolean字段,值序列化为False;
@Test public void testWriteNullBooleanAsFalse(){ Student student = new Student(2,"lichenglin",null,null,null); // 方法参数上添加枚举类型,可以让null值Boolean字段序列化输出为False; String s = JSON.toJSONString(student, SerializerFeature.WriteNullBooleanAsFalse); System.out.println(s); }
5). WriteDateUseDateFormat/PrettyFormat:日期格式化/格式化;
@Test public void testWriteDateUseDateFormat(){ Student student = new Student(2,"lichenglin",null,null,null,new Date()); // 日期格式化; String s = JSON.toJSONString(student, SerializerFeature.WriteDateUseDateFormat,SerializerFeature.PrettyFormat); System.out.println(s); }
5. JSonField
@JSonField可以作用在方法上、字段上和形参上,可以在序列化和反序列化时进行特性功能定制;
// name指定序列化后的名字;ordinal指定序列化后字段的顺序;format指定序列化后的格式 // serialize是否序列化该字段;deserialize是否反序列化;serializeFuture枚举类型; @JSONField(name = "stuName",ordinal = 1,serialize = false) private String name;
6. JSONType
@JSONType只能作用在类上;
// includes:要序列化的字段(@JSONField > @JSONType); orders:要序列化字段的顺序; SerializeFeature:枚举类型 @JSONType(includes = {"id","name"},orders = {"id","name"}) public class Student {}
7. SpringBoot集成FastJson
方式一:
@SpringBootApplication public class SpringBootJsonApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(SpringBootJsonApplication.class, args); } @Bean public HttpMessageConverters getHttpMessageConverters(){ // 1. 定义一个converters转换消息的对象; FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 2. 添加fastJson配置信息; FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); // 3. 在converter中添加配置信息; fastConverter.setFastJsonConfig(fastJsonConfig); // 4. 将converter赋值给HttpMessageConverter; HttpMessageConverter converter = fastConverter; return new HttpMessageConverters(converter); } }
方式二:
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { WebMvcConfigurer.super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 设置枚举类型; fastJsonConfig.setSerializerFeatures( SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteNullBooleanAsFalse, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.PrettyFormat ); // 处理中文乱码问题; List<MediaType> list = new ArrayList<>(); list.add(MediaType.APPLICATION_JSON_UTF8); fastJson.setSupportedMediaTypes(list); fastJson.setFastJsonConfig(fastJsonConfig); // 处理字符串,避免直接返回字符串时被添加引号; StringHttpMessageConverter smc = new StringHttpMessageConverter(); converters.add(smc); converters.add(fastJson); }
浙公网安备 33010602011771号