FastJson

😹 作者: gh-xiaohe
😻 gh-xiaohe的博客
😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

🚏 FastJson

🚀 一、Json数据格式回顾

🚬 Json数组格式

Json的数据本身是数组,中括号包裹,数组的元素之间逗号分开.数组元素的数据类型没有限制.

var jsonArray = ["元素1","元素2","元素3"]; //定义数组格式json
console.log(jsonArray[0]); //访问json数组的元素
for(var i = 0 ; i < jsonArray.length ; i++){
    console.log(jsonArray[i]); //遍历数组,访问每个元素
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBY3vksP-1680229730490)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230331090117192.png)]

🚬 Json对象格式

Json的数据本身是对象,大括号包裹.对象采用键值对形式存储,键固定为字符串类型,值是任意类型的数据.键和值使用冒号分开.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXos04TS-1680229730492)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330144159621.png)]

🚬 Json对象 和 数组 互相嵌套

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNlv8mUG-1680229730493)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230331090127507.png)]

🚄 二、FastJson介绍

FastJson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

🚬 Fastjson 的优点

  • 速度快
    fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
  • 使用广泛
    fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
  • 测试完备
    fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
  • 使用简单
    fastjson的 API 十分简洁。
  • 功能完备
    支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

🚬 FastJson序列化API

序列化 : 是指将Java对象转成json格式字符串的过程.JavaBean对象,List集合对象,Map集合,为应用最广泛的.

🛹 ① JSON.toJSONString 序列化Java对象

    @Test
    //Java中的对象,Student对象,序列化为Json格式字符串
    public void testObjectToJson(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setEmail("zs@sina.com");
        student.setBirthday(getDate());
        //student对象,转到Json格式字符串
        //调用静态方法,传递要转换的对象
        String jsonString = JSON.toJSONString(student);
        System.out.println(jsonString);
        //{"age":20,"birthday":1584257759911,"email":"zs@sina.com","id":1,"name":"张三"}
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8BcmSbIn-1680229730494)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330141559429.png)]

🛹 ② JSON.toJSONString 序列化List集合

    @Test
    //Java中的集合List,序列化为Json格式字符串
    public void testListToJson(){
        //集合List,存储Student对象
        List<Student> list = new ArrayList<Student>();
        Student student1 = new Student();
        student1.setId(1);
        student1.setName("张三");
        student1.setAge(20);
        student1.setEmail("zs@sina.com");
        student1.setBirthday(getDate());

        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setAge(22);
        student2.setEmail("ls@126.com");
        student2.setBirthday(getDate());
        //Student对象存储到List集合中
        list.add(student1);
        list.add(student2);
        //List集合,序列化为Json格式字符串
        String jsonString = JSON.toJSONString(list);
        System.out.println(jsonString);
        //转后的结果,是数组,数组的元素是对象
        //[{"age":20,"birthday":1584258063781,"email":"zs@sina.com","id":1,"name":"张三"},{"age":22,"birthday":1584258063781,"email":"ls@126.com","id":2,"name":"李四"}]
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7E7qPP5-1680229730494)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330141456430.png)]

🛹 ③ JSON.toJSONString 序列化Map集合

    @Test
    //Java中的集合Map,序列化为Json格式字符串
    public void testMapToJson(){
        //创建Map集合,键为字符串类型,值是Student对象
        Map<String,Student> map = new HashMap<String, Student>();
        Student student1 = new Student();
        student1.setId(1);
        student1.setName("张三");
        student1.setAge(20);
        student1.setEmail("zs@sina.com");
        student1.setBirthday(getDate());

        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setAge(22);
        student2.setEmail("ls@126.com");
        student2.setBirthday(getDate());
        //Map集合存储Student对象
        map.put("student1",student1);
        map.put("student2",student2);
        String jsonString = JSON.toJSONString(map);
        System.out.println(jsonString);
        //json格式字符串是对象,对象中有2个键,键对应的值是Student对象
        //{"student2":{"age":22,"birthday":1584260793271,"email":"ls@126.com","id":2,"name":"李四"},"student1":{"age":20,"birthday":1584260793271,"email":"zs@sina.com","id":1,"name":"张三"}}
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxUaw48v-1680229730495)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330141658339.png)]

🚬 FashJson反序列化API

🛹 ① JSON.parseObject 反序列化Java对象

    @Test
    //Json格式字符串,反序列化回到Java对象
    public void testJsonToObject(){
        String jsonString = "{\"age\":20,\"birthday\":1584257759911,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"}";
        //JSON类的静态方法 parseObject
        //传递要反序列化的Json字符串,传递Java对象的class对象
        Student student = JSON.parseObject(jsonString,Student.class);
        System.out.println(student);
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMB1hXeZ-1680229730495)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330141935809.png)]

🛹 ② JSON.parseArray 反序列化List集合

    @Test
    //Json格式字符串,反序列化回到List集合
    public void testJsonToList(){
        String jsonString = "[{\"age\":20,\"birthday\":1584258063781,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"},{\"age\":22,\"birthday\":1584258063781,\"email\":\"ls@126.com\",\"id\":2,\"name\":\"李四\"}]";
        //JSON类的静态方法, parseArray
        //传递json格式字符串,传递转换后的集合的泛型的class对象
        List<Student> list = JSON.parseArray(jsonString, Student.class);
        for(Student student : list){
            System.out.println(student);
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYSxlPAU-1680229730496)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330142001755.png)]

🛹 ③ JSON.parseObject 反序列化Map集合

    @Test
    //Json格式字符串,反序列化回到Map集合
    public void testJsonToMap(){
        String jsonString = "{\"student2\":{\"age\":22,\"birthday\":1584260793271,\"email\":\"ls@126.com\",\"id\":2,\"name\":\"李四\"},\"student1\":{\"age\":20,\"birthday\":1584260793271,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"}}";
        //JSON类的静态方法,parseObject
        //直接进行反序列化,Map集合没有泛型的, 泛型没有是不安全的集合
        //转后的集合,必须有泛型
        //调用parseObject,传递参数,TypeReference类型,在TypeReference类的泛型中,传递转后的Map集合
        Map<String,Student> map = JSON.parseObject(jsonString,new TypeReference<Map<String,Student>>(){});
        for (String key : map.keySet()){
            System.out.println(key +"::"+map.get(key));
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMplCchw-1680229730497)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330142026695.png)]

🚒 三、SerializerFeature枚举

  • WriteMapNullValue:是否输出值为 null 的字段,默认为 false。如果设置为 true,则输出值为 null 的字段。常用

  • WriteNullStringAsEmpty:是否将值为 null 的字符串输出为空字符串,而不是 null,默认为 false。如果设置为 true,则输出值为 null 的字符串的字段将被输出为空字符串。常用

  • WriteNullBooleanAsFalse:是否将值为 null 的布尔值输出为 false,而不是 null,默认为 false。如果设置为 true,则输出值为 null 的布尔值的字段将被输出为 false。常用

  • PrettyFormat:枚举常量,序列化,格式化 纵向输出常用

  • WriteNullListAsEmpty:是否将空的集合输出为空数组,而不是 null,默认为 false。如果设置为 true,则输出空的集合的字段将被输出为空数组。

  • WriteDateUseDateFormat:是否将日期格式化为 yyyy-MM-dd HH:mm:ss 格式,默认为 false。如果设置为 true,则输出日期字段将被格式化为指定格式。常用

  • DisableCircularReferenceDetect:是否禁止循环引用检测,默认为 false。如果设置为 true,则不会进行循环引用检测。

  • WriteEnumUsingToString:是否使用枚举的 toString() 方法输出枚举值,默认为 false。如果设置为 true,则输出枚举字段将使用 toString() 方法输出。

  • QuoteFieldNames:是否在输出的 JSON 中将字段名用双引号包裹,默认为 true。如果设置为 false,则输出的 JSON 中将不会包含双引号。

  • WriteBigDecimalAsPlain:是否将 BigDecimal 输出为普通数字,而不是科学计数法,默认为 false。如果设置为 true,则 BigDecimal 将被输出为普通数字。

  • WriteClassName:是否输出类名,默认为 false。如果设置为 true,则输出 JSON 时将包含类名信息。

  • SortField:是否按照字段名排序输出,默认为 false。如果设置为 true,则输出 JSON 时将按照字段名进行排序。

  • NotWriteDefaultValue:是否输出默认值,默认为 false。如果设置为 true,则输出 JSON 时将不会输出默认值的字段。

  • BrowserCompatible:是否输出浏览器兼容的 JSON 格式,默认为 false。如果设置为 true,则输出 JSON 时将按照浏览器兼容的格式进行输出。

  • IgnoreNonFieldGetter:是否忽略非字段的 getter 方法,默认为 false。如果设置为 true,则忽略非字段的 getter 方法。

  • WriteTabAsSpecial:是否将 tab 字符(\t)输出为 \t,默认为 false。如果设置为 true,则输出 JSON 时将将 tab 字符输出为 \t。

  • WriteNonStringValueAsString:是否将非字符串类型的值输出为字符串类型,默认为 false。如果设置为 true,则输出 JSON 时将将非字符串类型的值输出为字符串类型.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Omepgc7m-1680229730497)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230330142116614.png)]

该枚举支持序列化的一些特性数据定义

🚬 WriteMapNullValue 序列化为null的字段

   @Test
   // WriteMapNullValue 枚举中的常量,序列化null值的字段 
// 不设值时为null,默认不显示,如果设置值,替换空值
   public void testWriteMapNullValue(){
       Student student = new Student();
       student.setId(1);
       student.setName("张三");
       student.setAge(20);
       student.setBirthday(getDate());
       //student.setEmail("zs@sina.com");
       //方法的参数上,添加枚举类型
       String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
       System.out.println(jsonString);
   }

🚬 WriteNullStringAsEmpty 字段为null,序列化为""

    @Test
    //WriteNullStringAsEmpty 枚举的常量,序列化为null的字段,值序列化为""
    public void testWriteNullStringAsEmpty(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setBirthday(getDate());
        //student.setEmail("zs@sina.com");
        //方法的参数上,添加枚举类型
        String jsonString = JSON.toJSONString(student,SerializerFeature.WriteNullStringAsEmpty);
        System.out.println(jsonString);
    }

🚬 WriteNullNumberAsZero 字段为null,序列化为0

    @Test
    //WriteNullNumberAsZero 枚举的常量,序列化自动值为null,序列化为0
    public void testWriteNullNumberAsZero(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
//        student.setAge(20);
        student.setBirthday(getDate());
        student.setEmail("zs@sina.com");
        //方法的参数上,添加枚举类型
        String jsonString = JSON.toJSONString(student,SerializerFeature.WriteNullNumberAsZero);
        System.out.println(jsonString);
    }

🚬 WriteNullBooleanAsFalse 字段值为null 输出false

    @Test
    //WriteNullBooleanAsFalse 枚举常量,序列化,布尔值为null,序列化false
    public void testWriteNullBooleanAsFalse(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setBirthday(getDate());
        student.setEmail("zs@sina.com");
//        student.setFlag(true);
        String jsonString = JSON.toJSONString(student,SerializerFeature.WriteNullBooleanAsFalse);
        System.out.println(jsonString);
    }

🚬 WriteDateUseDateFormat 格式化日期格式

🚬 PrettyFormat格式化输出

    //WriteDateUseDateFormat 枚举常量,序列化,日期的格式化 默认毫秒值
    //PrettyFormat 枚举常量,序列化,格式化 纵向输出
    @Test
    public void testWriteDateUseDate_FormatPrettyFormat(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setBirthday(getDate());
        student.setEmail("zs@sina.com");
        String jsonString = JSON.toJSONString(student,SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.PrettyFormat);
        System.out.println(jsonString);
    }

🚤 四、@JSonField注解

该注解作用于方法上,字段上和参数上.可在序列化和反序列化时进行特性功能定制.

  • 注解属性 : name 序列化后的名字
  • 注解属性 : ordinal序列化后的顺序
  • 注解属性 : format 序列化后的格式
  • 注解属性 : serialize 是否序列化该字段
  • 注解属性 : deserialize 是否反序列化该字段
  • 注解属性 : serialzeFeatures 序列化时的特性定义
@Data
public class Student {
    private Integer id;

    //@JSONField 注解属性 name ,指定序列化后的名字
    //@JSONField 注解属性 ordinal ,指定序列化后的字段顺序  属性值越小,顺序靠前
    @JSONField(name = "studentName",ordinal = 1)
    private String name;

    @JSONField(ordinal = 2)
    private Integer age;

    //@JSONField 注解属性 serialize ,指定是否序列化该字段
    @JSONField(serialize = false)
    private String email;

    //@JSONField 注解属性 format 指定序列化后的格式
    @JSONField(format = "YYYY-MM-dd")
    private Date birthday;
    private Boolean flag;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-73Yl9Ohw-1680229730498)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230331091627724.png)]

🚗 五、@JSonType注解

该注解作用于类上,对该类的字段进行序列化和反序列化时的特性功能定制.

  • 注解属性 : includes 要被序列化的字段.
  • 注解属性 : orders 序列化后的顺序.
  • 注解属性 : serialzeFeatures 序列化时的特性定义
@Data
// 注解的属性 includes 要被序列化的字段
// 注解的属性 orders 要被序列化的字段的顺序
@JSONType(includes = {"id","name","age","address"},orders = {"name","age","id","address"})
public class Person {
    private int id;
    private String name;

    private int age;
    private String address;
}


/**
 * @JSonType 注解
 * 该注解作用于类上,对该类的字段进行序列化和反序列化时的特性功能定制
 */
public class TestFastJson4 {
    @Test
    public void test(){
        Person person = new Person();
        person.setId(1);
        person.setAddress("北京市");
        person.setName("张三");
        person.setAge(22);
        String jsonString = JSON.toJSONString(person);
        System.out.println(jsonString);
    }
}

🚲 六、Spring Boot 整合 Fastjson

Spring Boot可以很方便地整合Fastjson,只需要在pom.xml文件中添加Fastjson的依赖即可。

具体步骤如下:

🚬 在pom.xml文件中添加Fastjson的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

🚬 在Spring Boot的配置类中配置Fastjson:

public class FastjsonConfig {

    @Bean
    public HttpMessageConverters fastjsonHttpMessageConverters() {
        // 创建Fastjson消息转换器
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();

        // 创建配置类
        FastJsonConfig config = new FastJsonConfig();

        // 配置序列化策略
        config.setSerializerFeatures(
                SerializerFeature.WriteMapNullValue, // 输出空置字段
                SerializerFeature.WriteNullListAsEmpty, // list字段如果为null,输出为[],而不是null
                SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为"",而不是null
                SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而不是null
                SerializerFeature.WriteDateUseDateFormat // 日期格式化
        );

        // 配置中文编码格式
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        converter.setSupportedMediaTypes(fastMediaTypes);

        // 将配置添加到转换器中
        converter.setFastJsonConfig(config);

        HttpMessageConverter<?> converter1 = converter;
        return new HttpMessageConverters(converter1);
    }
}

🚬 在Controller中使用Fastjson:

@RestController
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        User user = new User();
        user.setId(1L);
        user.setName("张三");
        user.setAge(20);
        return user;
    }
}

这样就完成了Spring Boot整合Fastjson的配置。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
FastjsonFastjson2都是JSON库,用于处理JSON格式的数据。 Fastjson2是Fastjson项目的重要升级,旨在为未来十年提供高性能的JSON库。相比于原来的FastjsonFastjson2在性能上有了很大的提升,并且更加安全。它完全删除了autoType白名单,提升了安全性。 在使用上,导入Fastjson2的依赖后,与原来的Fastjson在代码上基本相同。唯一的区别是在Fastjson2中,将`jsonArray.toJavaList`方法转变为`jsonArray.toList`。 总结来说,FastjsonFastjson2都是用于处理JSON数据的库,但Fastjson2是Fastjson的升级版本,提供了更高的性能和更好的安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [fastjson2 介绍及使用](https://blog.csdn.net/qq_33697094/article/details/128114939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Fastjson2你开始使用了吗?来看看源码解析](https://blog.csdn.net/chenxuyuana/article/details/125581066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gh-xiaohe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值