阿里巴巴FastJSON使用实例

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 阿里巴巴FastJSON使用实例

1. 什么是fastjson?


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


Fastjson使用场景

 

Fastjson已经被广泛使用在各种场景,包括cache存储、RPC通讯、MQ通讯、网络协议通讯、Android客户端、Ajax服务器处理程序等等。


2.fastjson的优点


2.1 速度快


fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。


2.2 使用广泛


fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。


2.3 测试完备


fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。


2.4 使用简单


fastjson的API十分简洁。


String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化


2.5 功能完备


支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

以下例子对JSON.toJSONString和JSON.parseObject这2个重要方法进行测试:

 

Fruit实体类:


 package com.led.daorumysql;
  /**
   * 定义水果实体类
   * @author 86157
   *
   */
  public class Fruit {
     //水果名字
     private String name;
     //水果产地
     private String origin;
    //水果价格
     private Integer price;
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public String getOrigin() {
         return origin;
     }
     public void setOrigin(String origin) {
         this.origin = origin;
     }
     public Integer getPrice() {
         return price;
     }
     public void setPrice(Integer price) {
         this.price = price;
    }
     @Override
     public String toString() {
         return "Fruit [name=" + name + ", origin=" + origin + ", price=" + price + "]";
     }
     public Fruit(String name, String origin, Integer price) {
         super();
         this.name = name;
         this.origin = origin;
         this.price = price;
     }
     public Fruit() {
         super();
     }
 }

主类:


 package com.led.daorumysql;
  import java.util.ArrayList;
  import java.util.List;
  import com.alibaba.fastjson.JSON;
  /**
   * FastJSON测试类
  * @author 86157
  *
  */
 public class FastJSONTest {
     public static void main(String[] args) {
        //实例化Fruit类
         Fruit fruitOne = new Fruit("apple", "America", 13);
         Fruit fruitTwo = new Fruit("orange", "China", 15);
         //创建fruitList对象
        List<Fruit> fruitList = new ArrayList<Fruit>();
         fruitList.add(fruitOne);
         fruitList.add(fruitTwo);
         //将java对象(Fruit)转成json字符串
         System.out.println("=========将java对象(Fruit)转成json字符串===========");
         String fruitOne_jsonString = JSON.toJSONString(fruitOne);
         System.out.println("fruitOne_jsonString: " + fruitOne_jsonString);
         System.out.println();
         //将json字符串转成java对象(Fruit)
         System.out.println("=========将json字符串转成java对象(Fruit)===========");
         Fruit fruitOne_parseObject = JSON.parseObject(fruitOne_jsonString, Fruit.class);
         System.out.println("fruit object: " + fruitOne_parseObject);
         System.out.println("fruit name: " + fruitOne_parseObject.getName());
         System.out.println("fruit origin: " + fruitOne_parseObject.getOrigin());
         System.out.println("fruit price: " + fruitOne_parseObject.getPrice());
         System.out.println();
         //将java对象(fruitList)转成json字符串
         System.out.println("=========将java对象(fruitList)转成json字符串========");
         String fruitList_jsonString = JSON.toJSONString(fruitList);
        System.out.println("fruitList_jsonString: " + fruitList_jsonString);
         System.out.println();
         //将json字符串转成java对象(fruitList)
         System.out.println("=========将json字符串转成java对象(fruitList)========");
         List<Fruit> parseArray = JSON.parseArray(fruitList_jsonString, Fruit.class);
         System.out.println("fruitOne object: " + parseArray.get(0).toString());
         System.out.println("fruitTwo object: " + parseArray.get(1).toString());
         System.out.println("fruitTwo object name: " + parseArray.get(1).getName());
     }
 }

控制台输出:


 =========将java对象(Fruit)转成json字符串===========
  fruitOne_jsonString: {"name":"apple","origin":"America","price":13}
  =========将json字符串转成java对象(Fruit)===========
  fruit object: Fruit [name=apple, origin=America, price=13]
  fruit name: apple
  fruit origin: America
  fruit price: 13
 =========将java对象(fruitList)转成json字符串========
 fruitList_jsonString: [{"name":"apple","origin":"America","price":13},{"name":"orange","origin":"China","price":15}]
 =========将json字符串转成java对象(fruitList)========
 fruitOne object: Fruit [name=apple, origin=America, price=13]
 fruitTwo object: Fruit [name=orange, origin=China, price=15]
 fruitTwo object name: orange

注意:


实体类中要创建构造方法,不然parseObject会报如下错误:


Exception in thread "main" com.alibaba.fastjson.JSONException: default constructor not found. class com.led.daorumysql.Fruit
    at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:197)
    at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:465)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:412)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:324)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:594)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:569)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:257)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:227)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:186)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:310)
    at com.led.daorumysql.FastJSONTest.main(FastJSONTest.java:27)
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
JSON 安全 fastjson
《Elastic(中国)基础开发宝典》——Elasticsearch是否受最新的 fastjson 反序列化漏洞的影响?
《Elastic(中国)基础开发宝典》——Elasticsearch是否受最新的 fastjson 反序列化漏洞的影响?
|
JSON JavaScript 前端开发
Gson与Fastjson两种Json解析神器保姆级使用攻略
Gson与Fastjson两种Json解析神器保姆级使用攻略
441 0
Gson与Fastjson两种Json解析神器保姆级使用攻略
|
缓存 算法 安全
继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
165 0
继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
|
Cloud Native 前端开发 Java
Spring6 正式发布!重磅更新,是否可以拯救 Java
SpringFramework6.0.0 了!这是 2023 年及以后新一代框架的开始,包括 OpenJDK 和 Java 生态系统中当前和未来的创新。同时,我们将其精心设计为从 Spring Framework 5.3.x 直接升级到现代运行时环境。作为核心框架的一个主要修订,Spring framework 6.0 附带了 Java 17+基线和 Jakarta EE 9+(在 Jakarta 命名空间中),重点是最近发布的 Jakarta EE10 API,如 Servlet 6.0 和 JPA 3.1。这提供了对最新 web 容器(如 Tomcat 10.1)和最新持久性提供程序(如
1439 0
Spring6 正式发布!重磅更新,是否可以拯救 Java
|
JSON fastjson Java
为什么我们公司强制弃坑FastJson了?主推Jackson~
为什么我们公司强制弃坑FastJson了?主推Jackson~
768 0
为什么我们公司强制弃坑FastJson了?主推Jackson~
|
JSON 缓存 安全
大型项目废弃fastjson迁移至Gson保姆级攻略
本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson。 这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每一次出现漏洞都要推一次全公司的fastjson强制版本升级,很令公司头疼。 文章的前半部分,我会简单分析各种json解析框架的优劣,并给出企业级项目迁移json框架的几种解决方案。 在文章的后半部分,我会结合这一个月的经验,总结下Gson的使用问题,以及fastjson迁移到Gson踩过的深坑。
442 0
|
XML 缓存 负载均衡
Dubbo 2.7.7 发布,FastJson 升级了!
Apache Dubbo 2.7.7 已发布,这是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。
Dubbo 2.7.7 发布,FastJson 升级了!
|
存储 NoSQL Java
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十三
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十三
|
JSON fastjson Java
大型项目fastJson无缝迁移Gson血泪总结
# 前言 在前公司有将fastjson迁移至Gson的需求,当时组内由我牵头,花了将近一个月时间,将大部分Java仓库从fastjson迁移至了Gson。 这么做的主要的原因是当时正值FastJson AutoType漏洞频发,连续几个版本升级,每一次出现漏洞都要推一次全公司的fastjson强制版本升级,很令公司头疼,故推动全集团最迁移。 **文章的前半部分,我会简单分析各种json解析框
1654 0
|
移动开发 前端开发 小程序