fastjson和json对比。fastjson快速入门。

时间:2025-04-01 11:47:32

快速预览

    • 1. 什么是fastjson
    • 2. 什么是JSON
    • 如何使用
      • 3.1 创建demo
      • 3.2 将javaBean转化为JSON字符串
      • 3.3 将JSON字符串转化为JavaBean
      • 3.4 将JavaBean转化为JSON对象
      • 3.5 将JSON对象转化为JavaBean
      • 3.6 将JavaBean集合转化为JsonArray
      • 3.7 将JSONArray转化为JavaBean集合
      • 3.8 将JSON对象转化为JSON字符串
      • 3.9 将JSON字符串转化为JSON对象
      • 3.10 将JSON字符串转化为JSONArray的形式。

1. 什么是fastjson

​ fastjson是阿里巴巴推出的一款开源的Json处理器,也是目前比较流行的Json解析器和生成器
​ 它可以将任何java对象转化为Json,也可以将Json转化为Java对象。
​ fastjson广泛流行最大的原因就是其优越的性能表现。至今为止,没有一款Json处理工具在性能方面超过fastjson。fastjson支持java和Android两个开发语言。

2. 什么是JSON

​ 在继续了解fastjson之前,要先对json进行了解。如果您想继续了解fastjson的用法:fastjson如何使用

​ JSON全拼为 JavaScript Object Notation :JavaScript对象表示法。

​ JavaScript是什么?用来操控Html元素,在Web页面上与用户进行交互的。JSON并不是JS的一种对象,而是用来展示对象信息的一种格式。JSON本质上是一个串字符。

​ JSON的表现形式如下:

{"name":"张三", "age":23, "gender":"男"};
  • 1

​ 熟悉Map的朋友应该肯容易看出来这种 key - value 的数据结构

​ 以上面这段JSON代码为例,上面这一条JSON对象包含三个数据,分别是:

key(键) value(值)
name 张三
age 23
gender

​ JSON既然是一种数据格式,那么肯定有其特有的语法规则,其规则如下:

  1. JSON对象由花括号{}来保存。

  2. key(键)就是数据名称,通过键来拿去数据中的值。键需要用引号引起来,单双引号都可以,当然,也可以不写引号,不过为了便于和值区分,最好加上。

  3. 值就是普通的数据类型了。它支持以下数据类型:

    • 数字(整数或浮点数)

    • 字符串("")

    • 逻辑值(true or false)

    • 数组(方括号)

      [
          {"key", "value"},
          {"key2", true}
      ]
      
      • 1
      • 2
      • 3
      • 4
    • 对象(花括号)

       {'name':"李四", 'gender':0}
      
      • 1
    • null

    数组和对象是可以相互嵌套的:

    {
        'person':[
            {'name':"张三", 'age':22},
            {'name':"李四", 'age':23}
        ],
        'class':[
            {'name':"化工本一", 'id':0901},
            {'name':"英语本一", 'id':1201}
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

如何使用

​ 这里我们将通过一个demo来了解fastjson的功能和用法。在此之前,我们先来了解一下fastjson的一个常用注解:

​ @JSONField(属性 = “xxx”, …),用在字段上。

属性 作用
name Json中的key(键)
ordinal 按照值的从小到大顺序来输出java对象的字段内容
format 用在date上, 按照定义的类型显示时间
serialize 是否序列化(将java对象转化为字节类型的过程)
deserialize 是否反序列化(将字节类型转化为java对象的过程)

​ 在日常工作中,我们会用到@JSONField()注解来对字段进行修饰,得到想要的结果。

接下来,将通过demo来了解fastjson的用法。

3.1 创建demo

这里我们首先要在maven中导入maven依赖:

			<dependency>
			    <groupId></groupId>
			    <artifactId>fastjson</artifactId>
			    <version></version>
			</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

接下来创建一个用户类:

@Data
@AllArgsConstructor()
@NoArgsConstructor()
public class User {
    @JSONField(name = "姓名", ordinal = 1, serialize = false)
    private String name;
    
    @JSONField(name = "性别", ordinal = 2)
    private Integer gender;

    @JSONField(name = "邮箱", ordinal = 3)
    private String email;
    
    //无参构造和有参构造以及get/set方法通过Lombok创建
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接下来,创建测试类:

@Test
void testToString() throws JSONException {
    List<User> users = new ArrayList<>();
    User user1 = new User("张三", 1, "123@");
    User user2 = new User("王五", 1, "233@");
    users.add(user1);
    users.add(user2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.2 将javaBean转化为JSON字符串

首先将上面的User类转化为Json字符串。

//(Object)
String jsonString = JSON.toJSONString(user1);
System.out.println(jsonString);
  • 1
  • 2
  • 3

运行查看输出结果:

{"性别":1,"邮箱":"123@"}
  • 1

可以看到,不允许序列化的name字段,并没有在json字符串中显示出来,也就是说,fastjson没有解析该字段,只对其他字段进行了转化。

为了方便后面的操作,我们将User类中name字段的序列化设置为true(默认即为true,因此可以不写).

@JSONField(name = "名字", ordinal = 1, serialize = true)
private String name;
  • 1
  • 2

再次运行查看输出结果:

{"名字":"张三","性别":1,"邮箱":"123@"}
  • 1

可以发现User类中的name字段又被解析出来了。

3.3 将JSON字符串转化为JavaBean

//(JSONString, Class<Object>)
User stringToBean = JSON.parseObject(beanToString, User.class);
System.out.println(stringToBean);
System.out.println(user1);
  • 1
  • 2
  • 3
  • 4

运行查看输出结果:

User(name=张三, gender=1, email=123@123.com)
User(name=张三, gender=1, email=123@123.com)
  • 1
  • 2

可以发现转化后的对象和User1一致。

3.4 将JavaBean转化为JSON对象

//(Object)
JSONObject beanToObj = (JSONObject) JSON.toJSON(user2);
System.out.println(beanToObj.getString("名字"));
System.out.println(beanToObj);
  • 1
  • 2
  • 3
  • 4

运行程序查看输出结果:

王五
{"名字":"王五","邮箱":"233@","性别":1}
  • 1
  • 2

可以发现原来的JavaBean对象被转化为了JSON对象。

至于代码中为什么要强转JSONObject,是因为toJSON()方法的返回值为Object,在其内部对方法传入的对象进行了类型判断,我们找到JavaBean的判断方法:

ObjectSerializer serializer = config.getObjectWriter(clazz);
if (serializer instanceof JavaBeanSerializer) {
    JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) serializer;

    JSONObject json = new JSONObject();
    try {
        Map<String, Object> values = javaBeanSerializer.getFieldValuesMap(javaObject);
        for (Map.Entry<String, Object> entry : values.entrySet()) {
            json.put(entry.getKey(), toJSON(entry.getValue(), config));
        }
    } catch (Exception e) {
        throw new JSONException("toJSON error", e);
    }
    return json;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

可以发现其返回的是一个JSONObject对象。

JSONObject是Object的子类,也就是说父类Object可以接收JSONObject中的属性,但额外的子类方法在Object中是没办法使用的。

那么此时就可以用到父类强转了,将Object强转为JSONObject类,从而调用JSONObject中的方法,实现功能。

3.5 将JSON对象转化为JavaBean

//(JSONObject, Class<Object>)
User objToBean = JSON.toJavaObject(beanToObj, User.class);
System.out.println(objToBean);
  • 1
  • 2
  • 3

运行程序查看结果:

User(name=王五, gender=1, email=233@233.com)
  • 1

3.6 将JavaBean集合转化为JsonArray

// (Object)
JSONArray listBeanToJsonArray = (JSONArray) JSON.toJSON(users);
listBeanToJsonArray.forEach(System.out::println);
  • 1
  • 2
  • 3

运行查看结果:

{"名字":"张三","邮箱":"123@","性别":1}
{"名字":"王五","邮箱":"233@","性别":1}
  • 1
  • 2

这里也是调用了toJSON方法,在判断条件中,返回了一个JSONArray集合,同样的整个方法返回值也是Object。然而Java不能自动将Object(上层)转化为JSONArray(下层),所以,我们需要手动添加强转。

3.7 将JSONArray转化为JavaBean集合

//这里通过forEach循环遍历Json集合,然后将Json对象转化为JavaBean对象,最终将Java对象添加到Java集合中
List<User> listJsonArrayToBean = new ArrayList<>();
listBeanToJsonArray.forEach( json -> {
    User user = JSON.toJavaObject((JSON) json, User.class);
    listJsonArrayToBean.add(user);
});
listJsonArrayToBean.forEach(System.out::println);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行查看结果:

User(name=张三, gender=1, email=123@123.com)
User(name=王五, gender=1, email=233@233.com)
  • 1
  • 2

3.8 将JSON对象转化为JSON字符串

 //(JSONObject)
String objToString = JSONObject.toJSONString(beanToObj);
System.out.println(objToString);
  • 1
  • 2
  • 3

运行查看结果:

{"名字":"王五","邮箱":"233@","性别":1}
  • 1

3.9 将JSON字符串转化为JSON对象

//(JSONString)
JSONObject stringToObj = JSON.parseObject(objToString);
System.out.println(stringToObj.getString("邮箱"));
  • 1
  • 2
  • 3

运行查看结果:

233@233.com
  • 1

3.10 将JSON字符串转化为JSONArray的形式。

//(JSONString)
JSONArray stringToJsonArray = JSON.parseArray(JSON.toJSONString(users));
stringToJsonArray.forEach(System.out::println);
  • 1
  • 2
  • 3

运行查看结果:

{"名字":"张三","邮箱":"123@","性别":1}
{"名字":"王五","邮箱":"233@","性别":1}
  • 1
  • 2