一文搞定FastJSON库

目录

是什么

依赖

核心类

JSON

常用方法

toJSONString(Object object)

parseObject(String text)

parseObject(String text, Class clazz)

parseArray(String text)

parseArray(String text, Class clazz)

isValid(String text)

JSONObject

常用方法

put(String key, Object value)

remove(Object key)

get(String key)

get***系列

KeySet()

size()

containsKey(Object key)

clear()

toJSONString()

JSONArray

常用方法

add(Object value)

get***系列

length()

toJSONString()

toArray()

toJavaList(JSONArray jsonArray)

注解

1. fastjson中的注解

2. 注解的作用

3. 注解的具体参数说明

具体使用示例

Java对象转换为JSON字符串

Java集合转为JSON字符串

JSON字符串转换为Java对象

JSON字符串转为集合

获取JSON字符串中(字符串,数值)

获取JSON字符串(字符串,数组)

获取JSON对象中(数组-包含多个json对象)

相关链接


是什么

阿里巴巴开发的开源JSON解析库,由Java语言编写,它主要被设计用于将 Java 对象与 JSON 数据进行相互转换。

PS:它是一个专注于JSON格式的Java库。Fastjson的主要功能包括JSON序列化和反序列化,即可以将Java对象转换为JSON格式的字符串,也可以将JSON字符串转换为Java对象。


依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version><!--这里以1.2.83为例-->
</dependency>

PS:某些版本可能存在安全漏洞,因此在使用时需要确保使用的是最新且已修复漏洞的版本。


核心类

JSON

工具类,提供了一系列的静态方法来序列化和反序列化JSON(对象和数组)字符串和Java对象之间的转换。

常用方法

toJSONString(Object object)

作用:将Java对象序列化为JSON格式的对象或数组字符串。

返回值:序列化后的JSON格式的对象或数组字符串。

示例:

User user = new User();  
user.setName("张三");  
user.setAge(25);
// 将对象转为JSON格式的对象字符串
String jsonString = JSON.toJSONString(user);

List<User> userList = new ArrayList<>();  
userList.add(new User("王二", 25));  
userList.add(new User("张三", 30));  
userList.add(new User("李四", 35)); 
// 将集合对象转为JSON格式的数组字符串
String jsonArrayString = JSON.toJSONString(userList); 

parseObject(String text)

作用:将JSON文本解析为JSONObject

返回值:反序列化后的JSONObject对象

示例:

String jsonString = "{\"name\":\"Alice\",\"age\":25}";  
JSONObject jsonObject = JSON.parseObject(jsonString);

parseObject(String text, Class<T> clazz)

作用:将JSON对象字符串反序列化为Java对象(JavaBean)。

返回值:反序列化后的Java对象。

示例:

String jsonString = "{\"name\":\"Alice\",\"age\":25}";  
User user = JSON.parseObject(jsonString, User.class);

PS:User 类中的字段名称必须与 JSON 字符串中的键名称相匹配,否则无法正确映射。


parseArray(String text)

作用:将JSON格式的数组字符串反序列化为集合,不需要指定集合中元素的类型。

返回值:反序列化后的Java集合,集合中的元素类型为Object类型。

示例:

String jsonText = "[{\"name\": \"Alice\", \"age\": 25},{\"name\": \"Bob\", \"hobby\": \"swimming\"},\"Hello, World!\"]";  
List<Object> objectList = JSON.parseArray(jsonText);

PS:这种方法在你不知道或者不关心数组中元素的具体类型时非常有用。


parseArray(String text, Class<T> clazz)

作用:将JSON格式的数组字符串反序列化为Java中的集合对象,需要指定集合中元素的类型。

返回值:反序列化后的Java集合,集合中元素的类型为指定的类型。

示例:

String jsonString = "[{\"name\":\"张三\",\"age\":25},{\"name\":\"李四\",\"age\":30}]";  
List<User> userList = JSON.parseArray(jsonString, User.class);

补充:将JSON字符串反序列化为Java中的数组

说明:fastJson中JSON类并没有直接提供一个将 JSON 字符串转换为 Java 数组的方法,但可以先将 JSON 数组字符串转换为 JSONArray,然后从中提取数据并转换为 Java 数组。

示例:

String jsonString = "[\"Alice\", \"Bob\", \"Charlie\"]";  
  
// 使用 parseArray 方法将 JSON 数组字符串转换为 JSONArray  
JSONArray jsonArray = JSON.parseArray(jsonString);  
  
// 将 JSONArray 转换为 Java 数组  
String[] names = new String[jsonArray.size()];  
for (int i = 0; i < jsonArray.size(); i++) {  
    names[i] = jsonArray.getString(i);  
}  

isValid(String text)

作用:验证JSON字符串的有效性。

返回值:返回值为boolean类型,JSON字符串有效返回true,否则返回false。

示例:

String validJson = "{\"name\":\"Alice\",\"age\":25}";  
String invalidJson = "This is not JSON";  

boolean isValid = JSON.isValid(validJson); // true  
boolean isInvalid = JSON.isValid(invalidJson); // false

JSONObject

用于处理JSON对象的类。继承自JSON类,并且实现了Map<String,Object>接口,数据结构为键值对的形式(通过键获取值)。

import com.alibaba.fastjson.JSONObject;  
  
public class FastJsonExample {  
    public static void main(String[] args) {  
        String jsonString = "{\"name\":\"John\",\"age\":30,\"married\":false}";  
        JSONObject jsonObject = JSONObject.parseObject(jsonString);  
        String name = jsonObject.getString("name");  
        int age = jsonObject.getIntValue("age");  
        boolean married = jsonObject.getBoolean("married");  
        System.out.println("Name: " + name + ", Age: " + age + ", Married: " + married);  
    }  
}

常用方法

特别说明:因fastJson主要是为了处理序列化和反序列化,对于Map接口的方法实现可能在方法内直接调用其它Map实现类的方法。但对于我们使用者来说,无需太过关注底层实现(fastjson是开源的,可能在不同版本底层实现会有所不同)。

put(String key, Object value)

作用:添加(或修改)一个键值对。

返回值:先前的值(Object类型),如果键已经存在则返回该键对应的旧值,否则返回null。

示例:

Object previousValue = jsonObject.put("name", "John");

remove(Object key)

作用:移除指定的键及其对应的值,如果键不存在则返回null。

返回值:移除的键对应的值(Object类型)。

示例:

Object removedValue = jsonObject.remove("keyName"); 

get(String key)

作用:根据给定的键(key)获取对应的值(value)。如果键不存在,则返回null。

返回值:具体键对于的值(Object类型)。

示例:

Object value = jsonObject.get("keyName");

get***系列

作用:提供了类型安全的方法来获取特定类型的值。如果键不存在或值无法转换为请求的类型,这些方法将抛出异常。

返回值:根据调用的get***的方法获取特定类型的值。

示例:

// 根据给定key获取对象中的String
String strValue = jsonObject.getString("keyName");
// 根据给定key获取对象中的Integer
Integer intValue = jsonObject.getInteger("keyName");
// 其它Java的类型就不再举例...

// 根据给定key获取对象中的JSONObject
JSONObject subObj = jsonObject.getJSONObject("subKeyName");
// 根据给定key获取对象中的JSONArray
JSONArray array = jsonObject.getJSONArray("arrayKeyName");

KeySet()

作用:获取所有键集合。

返回值:Set集合类型的键集合。

示例:

Set<String> keySet = jsonObject.keySet();

// 遍历 keySet
for (String key : keySet) {  
    System.out.println("Key: " + key);  
    // 你也可以同时获取并打印对应的值  
    Object value = jsonObject.get(key);  
    System.out.println("Value: " + value);  
}

size()

作用:获取JSONObject中键值对的数量。

返回值:键值对的数量。

示例:

int size = jsonObject.size();

containsKey(Object key)

作用:判断JSONObject是否包含指定的键。

返回值:一个boolean值。

示例:

boolean contains = jsonObject.containsKey("keyName");

containsValue(Object value)

作用:判断JSONObject是否包含指定的值(此方法可能需要遍历整个JSONObject,因此效率可能较低)。

返回值:一个boolean值。

示例:

boolean contains = jsonObject.containsValue(someValue);

clear()

作用:移除JSON对象中的所有键值对。

返回值:无。

示例:

jsonObject.clear();

toJSONString()

作用:将JSONObject对象转换为JSON格式的字符串。

返回值:转换后JSON字符串。

示例:

String jsonString = jsonObject.toJSONString();

JSONArray

用于处理JSON数组的类,继承自JSON类,并且实现了List<Object>接口,数据结构为集合的形式(通过下标获取值)。

常用方法

add(Object value)

作用:

返回值:

示例:

jsonArray.add("element");

get***系列

作用:获取数组中的元素。

返回值:根据调用的方法返回对应类型的数据。

示例:

// getJSONObject(int index)    说明:返回指定索引处的元素,并将其作为 JSONObject 对象。
JSONArray jsonArray = new JSONArray("[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]");
JSONObject jsonObject = jsonArray.getJSONObject(0);
String name = jsonObject.getString("name"); // Alice

// getJSONArray(int index)    说明:返回指定索引处的元素,并将其作为 JSONArray 对象(如果元素本身是一个数组)。
JSONArray jsonArray = new JSONArray("[[1,2,3],[4,5,6]]");
JSONArray innerArray = jsonArray.getJSONArray(0);
int firstElement = innerArray.getInt(0); // 1

// get(int index)    说明:返回指定索引处的元素,并将其作为 Object 对象。需要自己将其转换为适当的类型。
JSONArray jsonArray = new JSONArray("[\"Alice\",\"Bob\",3]");
Object element = jsonArray.get(2);
if (element instanceof Integer) {
    int number = (Integer) element; // 3
}

JSONArray jsonArray = new JSONArray("[\"Alice\", 30, 25.5, true, 10000000000L]");
// 使用 getString 方法获取字符串
String stringValue = jsonArray.getString(0);
System.out.println("String value at index 0: " + stringValue); // 输出: Alice

// 使用 getInt 方法获取整数
int intValue = jsonArray.getInt(1);
System.out.println("Int value at index 1: " + intValue); // 输出: 30

// 使用 getDouble 方法获取双精度浮点数
double doubleValue = jsonArray.getDouble(2);
System.out.println("Double value at index 2: " + doubleValue); // 输出: 25.5

// 使用 getBoolean 方法获取布尔值
boolean booleanValue = jsonArray.getBoolean(3);
System.out.println("Boolean value at index 3: " + booleanValue); // 输出: true

// 使用 getLong 方法获取长整型数
long longValue = jsonArray.getLong(4);
System.out.println("Long value at index 4: " + longValue); // 输出: 10000000000

length()

作用:获取JSONArray中元素的数量。

返回值:JSONArray中元素的数量。

示例:

JSONArray jsonArray = new JSONArray("[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]");
int size = jsonArray.length();

toJSONString()

作用:将JSONArray转换为JSON字符串。

返回值:转换后JSON字符串。

示例:

String jsonString = jsonArray.toJSONString();  

toArray()

作用:将JSONArray转换为Java数组。

返回值:转换后的Object数组。

示例:

Object[] objects = jsonArray.toArray();

toJavaList(JSONArray jsonArray)

作用:将JSONArray转换为Java集合。

返回值:转换后的Java List。

示例:

List<Object> list = (List<Object>) JSONArray.toJavaList(jsonArray);

注解

注解(Annotation)是一种用于为Java代码提供元数据的机制,它允许开发者在编译时为类、方法、变量等添加额外的信息,这些信息可以在运行时通过反射机制获取。fastjson提供了几种特定的注解,用于控制JSON序列化和反序列化的行为。

1. fastjson中的注解

fastjson主要提供了以下几种注解:

  • @JSONType:用于JavaBean上,可以规定哪些字段需要忽略或者需要包含,以及配置特性。
  • @JSONField:用于JavaBean的具体字段或者方法上,可以修改某个属性的输出名称,规定其支持序列化或者反序列化与否以及规定序列化顺序。
  • @JSONCreator:用于构造方法上,标识这个构造方法是用于反序列化的。
  • @JSONPOJOBuilder:用于构建者模式(Builder Pattern)的类上,标识这个类是用于构建JavaBean的。

2. 注解的作用

  • 控制序列化和反序列化的行为:通过注解,可以指定哪些字段需要被序列化或反序列化,哪些字段需要被忽略。
  • 自定义字段名称:在JSON和JavaBean之间映射时,可以使用注解来指定字段的别名。
  • 指定序列化顺序:可以通过注解来指定字段的序列化顺序。
  • 支持复杂的JSON结构:例如,对于嵌套的JSON对象或数组,可以使用注解来指导fastjson如何正确地解析它们。

3. 注解的具体参数说明

@JSONField为例,其主要参数包括:

  • name:用于指定序列化后的JSON字段名或反序列化时的JSON字段名。例如:@JSONField(name="project_name")
  • format:当字段类型为Date时,用于指定日期时间的格式化字符串。
  • serialize:用于指定该字段是否参与序列化。当值为false时,该字段不会被序列化到JSON中。
  • deserialize:用于指定该字段是否参与反序列化。当值为false时,该字段在反序列化时不会被赋值。
  • serialzeFeatures:这是一个SerializerFeature类型的枚举数组,用于指定该字段的序列化特性。例如,@JSONField(serialzeFeatures=SerializerFeature.WriteMapNullValue)表示当该字段的值为null时,仍然会将其序列化到JSON中。

请注意,以上参数并非@JSONField的全部参数,fastjson的注解还提供了许多其他功能和选项,可以根据具体需求进行配置。此外,@JSONType@JSONCreator@JSONPOJOBuilder等注解也有各自特定的参数和用法。建议查阅fastjson的官方文档或相关教程以获取更详细的信息。


具体使用示例

无需了解,快速上手使用。

JSON格式的数据主要由两种结构组成:对象数组。这两种结构可以嵌套使用,形成复杂的JSON数据。

常见JSON格式数据组成

// 对象中包含数组
{
  "name": "John",
  "age": 30,
  "cars": [
    "Ford",
    "BMW",
    "Fiat"
  ]
}

// 数组包含对象
[
  {
    "id": 1,
    "name": "Apple",
    "price": 5.99
  },
  {
    "id": 2,
    "name": "Banana",
    "price": 2.99
  }
]

//对象包含数组和对象
{
  "person": {
    "name": "Alice",
    "age": 25,
    "address": {
      "street": "123 Main St",
      "city": "Wonderland"
    },
    "phones": [
      "123-456-7890",
      "987-654-3210"
    ]
  }
}

//数组包含数组和对象
[
  {
    "name": "Group 1",
    "members": [
      "Alice",
      "Bob"
    ],
    "activities": [
      "Hiking",
      "Camping"
    ]
  },
  {
    "name": "Group 2",
    "members": [
      "Charlie",
      "David"
    ],
    "activities": [
      "Swimming",
      "Cycling"
    ]
  }
]

以下为常见类型对象与JSON格式字符串之间的转换示例


Java对象转换为JSON字符串

示例(序列化)代码如下所示:

import com.alibaba.fastjson.JSON;
 
public class Main {
    public static void main(String[] args) {
        // 创建要序列化的对象
        User user = new User("John", "Doe");
        
        // 使用fastjson进行序列化
        String jsonStr = JSON.toJSONString(user);
        
        System.out.println(jsonStr);
    }
}
 
class User {
    private String firstName;
    private String lastName;
    
    public User() {}
    
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    // Getters and setters
}

输出结果:{"firstName":"John","lastName":"Doe"}


Java集合转为JSON字符串

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class Main {
    public static void main(String[] args) {
        // 定义一个集合并添加元素
        List<Integer> array = new ArrayList<>();
        array.add(50);
        array.add(60);
        array.add(7);

        // 创建一个 JSONObject 来存储这些数据
        JSONObject jsonObject = new JSONObject();
        JSONArray intArrayJson = new JSONArray();
        intArrayJson.addAll(array);
        jsonObject.put("intArrayKey", intArrayJson);

        System.out.println(jsonObject);
    }
}

输出结果:

{"intArrayKey":[50,60,7]}


JSON字符串转换为Java对象

示例(反序列化)代码如下所示:

import com.alibaba.fastjson.JSON;
 
public class Main {
    public static void main(String[] args) {
        // 定义包含JSON数据的字符串
        String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\"}";
        
        // 使用fastjson进行反序列化
        User user = JSON.parseObject(jsonStr, User.class);
        
        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());
    }
}
 
class User {
    private String firstName;
    private String lastName;
    
    public User() {}
    
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    // Getters and setters
}

输出结果:

John

Doe


JSON字符串转为集合<T>

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
 
import java.util.List;
 
public class Main {
    public static void main(String[] args) {
        String jsonString = "[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]";
 
        // 解析 JSON 字符串为 User 对象的列表
        List<User> userList = JSON.parseObject(jsonString, new TypeReference<List<User>>() {});
 
        // 打印解析后的 User 对象列表
        for (User user : userList) {
            System.out.println(user.getName());
        }
    }
}
 
// User 类的定义
class User {
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

输出结果:

Alice
Bob

PS:TypeReference 指定目标类型的泛型信息。


获取JSON字符串中(字符串,数值)

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
 
public class Main {
    public static void main(String[] args) {
        // JSON字符串
        String jsonStr = "{\"name\":\"John\", \"age\":30}";
        
        // 将JSON字符串转换为JSON对象
        JSONObject jsonObj = JSON.parseObject(jsonStr);
        
        // 通过键名获取值
        String name = jsonObj.getString("name");
        int age = jsonObj.getIntValue("age");
        
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

输出结果:

Name: John

Age: 30

获取JSON字符串(字符串,数组)

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
 
public class Main {
    public static void main(String[] args) {
        // JSON字符串,数组
        String jsonStr = "{\"firstName\":\"John\", \"lastName\":\"Doe\" ," +
                "\"array\":[\"唱\",\"跳\",\"rap\"]}";
        
        // 将JSON字符串转换为JSON对象
        JSONObject jsonObj = JSON.parseObject(jsonStr);
        
        // 通过键名获取值
        String firstName = jsonObj.getString("firstName");
        String lastName = jsonObj.getString("lastName");
        JSONArray jsonArray = jsonArray.getJSONArray("array");
        for (int i = 0; i < jsonArray.size(); i++) {
            Object value = jsonArray.get(i);

            System.out.println(value);
        }

        System.out.println(firstName);
        System.out.println(lastName);
    }
}

输出结果:



rap
John
Doe

获取JSON对象中(数组-包含多个json对象)

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
 
public class Main {
    public static void main(String[] args) {
        // JSON数组-多个json对象
        String jsonStr = "{\"array\":[{\"name\":\"张三\",\"sex\":\"男\"}," +
                "{\"name\":\"李四\",\"sex\":\"女\"}]}";
        
        // 将JSON字符串转换为JSON对象
        JSONObject jsonObj = JSON.parseObject(jsonStr);
        
        // 通过键名获取值
        JSONArray jsonArray = jsonArray.getJSONArray("array");
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject json = JSON.parseObject(jsonArray.get(i).toString());
            String name = json.getString("name");
            String sex = json.getString("sex");
            
            System.out.println(name);
            System.out.println(sex);
        }
    }
}

输出结果:

张三

李四


相关链接

JSON是什么?以及JSON结构的说明。

JSON(JavaScript Object Notation)-CSDN博客

序列化和反序列

序列化和反序列化-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值