Fastjson 常用语法

发布时间:2023年12月22日

一.Fastjson 简介

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

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

二.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十分简洁。

2.5 功能完备

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

三.下载和使用

3.1 配置maven依赖

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

四.将 Java 对象转换为 JSON 格式

  • 定义以下 Person JavaBean:
package com.liming.entity;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
     
    @JSONField(name = "AGE")
    private int age;
 
    @JSONField(name = "FULL NAME")
    private String fullName;
 
    @JSONField(name = "DATE OF BIRTH")
    private Date dateOfBirth;

}
  • 使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象:
@Test
void testToJSONString() {
    // 创建集合
    List<Person> personList = new ArrayList<>();
    // 添加数据
    Collections.addAll(personList,
            new Person(15, "张三", new Date()),
            new Person(21, "李四", new Date()));
    // 打印数据
    System.out.println(JSON.toJSONString(personList));
}

输出结果为:

[
  {
    "AGE": 15,
    "DATE OF BIRTH": 1703215456830,
    "FULL NAME": "张三"
  },
  {
    "AGE": 21,
    "DATE OF BIRTH": 1703215456830,
    "FULL NAME": "李四"
  }
]

我们还可以自定义输出,并控制字段的排序日期显示格式序列化标记等,接下来我们更新实体类并添加几个字段:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    @JSONField(name="AGE", serialize=false)
    private int age;

    @JSONField(name="LAST NAME", ordinal = 2)
    private String lastName;

    @JSONField(name="FIRST NAME", ordinal = 1)
    private String firstName;

    @JSONField(name="DATE OF BIRTH", format="YYYY-MM-dd HH:mm:ss", ordinal = 3)
    private Date dateOfBirth;

}

以上代码中我们列出了基本参数类别,并使用 @JSONField 注解,以便实现自定义转换:

  • format 参数用于格式化 date 属性。
  • 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 serialize 指定字段不序列化。
  • 使用 ordinal 参数指定字段的顺序

使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象:

@Test
void testToJSONString() {
    // 创建集合
    List<Person> personList = new ArrayList<>();
    // 添加数据
    Collections.addAll(personList,
            new Person(15, "张", "张三", new Date()),
            new Person(21, "李", "李四", new Date()));
    // 打印数据
    System.out.println(JSON.toJSONString(personList));
}

这样,以上输出结果为:

[
  {
    "FIRST NAME": "张三",
    "LAST NAME": "张",
    "DATE OF BIRTH": "2023-12-22 11:32:33"
  },
  {
    "FIRST NAME": "李四",
    "LAST NAME": "李",
    "DATE OF BIRTH": "2023-12-22 11:32:33"
  }
]

五.@JSONField

@JSONField 的作用对象:字段,方法

public @interface JSONField {
    // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名称
    String name() default "";

    // 指定字段的格式,对日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}
  • 字段上:可以在字段上使用 @JSONField 注解来指定字段的序列化和反序列化的行为,例如:
public class User {
    @JSONField(name = "id")
    private Long userId;
    
    @JSONField(format = "yyyy-MM-dd")
    private Date birthDate;
    
    // getters and setters
}
  • 方法上:可以在 getter 或者 setter 方法上使用 @JSONField 注解来控制对应字段的序列化和反序列化行为,例如:
public class User {
    private Long userId;
    private String username;
    
    @JSONField(name = "id")
    public Long getUserId() {
        return userId;
    }
    
    @JSONField(name = "id")
    public void setUserId(Long userId) {
        this.userId = userId;
    }
    
    // getters and setters for other fields
}

六.SerializerFeature

SerializerFeature 是 Fastjson 序列化库提供的一组枚举常量,用于配置 JSON 序列化过程中的不同特性和选项。通过在序列化时传递相应的 SerializerFeature 常量,可以根据需求自定义序列化行为。

以下是一些常用的 SerializerFeature 常量及其作用:

  • WriteNullListAsEmpty:将空集合序列化为 [],而不是 null。
  • WriteNullStringAsEmpty:将空字符串序列化为 “”,而不是 null。
  • WriteNullNumberAsZero:将空数字类型序列化为 0,而不是 null。
  • WriteNullBooleanAsFalse:将空布尔值序列化为 false,而不是 null。
  • WriteMapNullValue:序列化时包含字段值为 null 的属性。
  • WriteDateUseDateFormat:将 java.util.Date 类型序列化为格式化后的日期字符串。
  • QuoteFieldNames:强制将所有字段名用双引号包裹。
  • SortField:按字段名称排序后输出 JSON。

可以通过 JSON.toJSONString 方法的第二个参数来传递一个 SerializerFeature 数组,以启用多个特性。例如:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("Alice");

        String json = JSON.toJSONString(user,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteDateUseDateFormat);
        System.out.println(json); // {"name":"Alice","birthday":""}
    }
}

class User {
    private String name;
    private Date birthday;

    // getters and setters
}

七.创建 JSON 对象

创建 JSON 对象非常简单,只需使用 JSONObject(fastJson提供的json对象) 和 JSONArray(fastJson提供json数组对象) 对象即可。

我们可以把JSONObject 当成一个 Map<String,Object> 来看,只是 JSONObject 提供了更为丰富便捷的方法,方便我们对于对象属性的操作。我们看一下源码:

在这里插入图片描述

同样我们可以把 JSONArray 当做一个List<Object>,可以把 JSONArray 看成 JSONObject 对象的一个集合,查看源码:

在这里插入图片描述

此外,由于JSONObjectJSONArray 继承了 JSON,所以说也可以直接使用两者对 JSON 格式字符串与 JSON 对象及 javaBean 之间做转换。

@Test
void testJSONArrayAndJSONObject(){
    JSONArray jsonArray = new JSONArray();
    for (int i = 0; i < 2; i++) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("age",21);
        jsonObject.put("name","jeck"+i);
        jsonObject.put("dateOfBirth","2023-12-22 12:12:12");
        jsonArray.add(jsonObject);
    }
    System.out.println(jsonArray.toJSONString());
}

输出结果为:

[
  {
    "name": "jeck0",
    "dateOfBirth": "2023-12-22 12:12:12",
    "age": 21
  },
  {
    "name": "jeck1",
    "dateOfBirth": "2023-12-22 12:12:12",
    "age": 21
  }
]

八.JSON 字符串转换为 Java 对象

我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象,代码如下:

@Test
public void testParseObject() {
    Person person = new Person(20, "张", "张三", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);
    System.out.println(newPerson);
}

输出结果为:

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_46370595/article/details/135148674
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。