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);
    }

 

  

 

  

posted on 2023-03-02 15:16  VaeSSAQ  阅读(9)  评论(0)    收藏  举报