一文搞定—FastJson详解 与 使用

FastJson详解 与 使用

1. Fastjson 的主要功能

2. 快速开始

2.1 对象与 JSON 字符串的转换

2.2 List 与 JSON 字符串的转换

3. 注解支持

4. JSONPath 查询

5. 性能与安全

6. 版本与兼容性

7.常用方法

7.1 JSON.toJSONString(Object object)

7.2 JSON.parseObject(String text, Class clazz)

7.3 JSON.parseArray(String text, Class clazz)

7.4 JSON.toJavaObject(JSONObject jsonObject, Class clazz)

7.5 JSONObject 类

7.6 JSONArray 类

7.7 反序列化为泛型类型

8.配置选项 

8.1 SerializerFeature

8.2 ParserConfig

 9.总结


🎈边走、边悟🎈迟早会好

   Fastjson 是阿里巴巴开源的一个高性能 Java JSON 处理库,广泛应用于 Java 开发中。它提供了序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)的功能。与其他 JSON 处理库相比,Fastjson 以其速度快、使用简单、功能强大而著称。

1. Fastjson 的主要功能

  • 序列化和反序列化:将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象。
  • 支持泛型:能够处理泛型数据类型的序列化和反序列化。
  • JSONPath 支持:类似于 XPath 的语法,可以方便地查询 JSON 数据。
  • 注解支持:支持通过注解自定义序列化和反序列化行为。

2. 快速开始

要使用 Fastjson,首先需要在项目中添加 Maven 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>
2.1 对象与 JSON 字符串的转换

序列化:将 Java 对象转换为 JSON 字符串

import com.alibaba.fastjson.JSON;

public class FastjsonExample {
    public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setName("John Doe");

        // 序列化
        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString); // 输出:{"id":1,"name":"John Doe"}
    }
}

class User {
    private int id;
    private String name;

    // getter 和 setter 方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

反序列化:将 JSON 字符串转换为 Java 对象 

import com.alibaba.fastjson.JSON;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"id\":1,\"name\":\"John Doe\"}";

        // 反序列化
        User user = JSON.parseObject(jsonString, User.class);
        System.out.println(user.getName()); // 输出:John Doe
    }
}
2.2 List 与 JSON 字符串的转换

序列化:将 List 转换为 JSON 字符串

import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

public class FastjsonExample {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "John Doe"));
        users.add(new User(2, "Jane Doe"));

        // 序列化
        String jsonString = JSON.toJSONString(users);
        System.out.println(jsonString); // 输出:[{"id":1,"name":"John Doe"},{"id":2,"name":"Jane Doe"}]
    }
}

 反序列化:将 JSON 字符串转换为 List

import com.alibaba.fastjson.JSON;
import java.util.List;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";

        // 反序列化
        List<User> users = JSON.parseArray(jsonString, User.class);
        for (User user : users) {
            System.out.println(user.getName());
        }
    }
}

3. 注解支持

Fastjson 提供了 @JSONField 注解,可以用来控制字段的序列化和反序列化行为。

import com.alibaba.fastjson.annotation.JSONField;

public class User {
    private int id;

    @JSONField(name = "fullName")
    private String name;

    @JSONField(serialize = false)
    private String password;

    // getter 和 setter
}

在这个例子中:

  • @JSONField(name = "fullName") 会将 name 字段序列化为 fullName
  • @JSONField(serialize = false) 会使 password 字段不被序列化。

4. JSONPath 查询

Fastjson 支持 JSONPath,这是一种用于查询 JSON 数据的表达式语言。

 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;
import java.util.Map;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"id\":1,\"name\":\"John Doe\",\"address\":{\"city\":\"New York\"}}";
        Map<String, Object> data = JSON.parseObject(jsonString);

        // 使用 JSONPath 查询
        Object city = JSONPath.eval(data, "$.address.city");
        System.out.println(city); // 输出:New York
    }
}

5. 性能与安全

Fastjson 以其高性能著称,但在使用时需要注意安全性问题,特别是在反序列化过程中可能会存在反序列化漏洞。因此,在使用 Fastjson 进行反序列化时,应确保 JSON 数据来源的可信性,并尽可能使用 JSON.parseObject(String text, Class<T> clazz) 等安全的方法。

6. 版本与兼容性

确保使用最新版本的 Fastjson,因为更新版本通常会修复已知的安全问题和性能问题。

7.常用方法

7.1 JSON.toJSONString(Object object)

将 Java 对象序列化为 JSON 字符串。

import com.alibaba.fastjson.JSON;

public class FastjsonExample {
    public static void main(String[] args) {
        User user = new User(1, "John Doe");
        String jsonString = JSON.toJSONString(user);
        System.out.println(jsonString); // 输出:{"id":1,"name":"John Doe"}
    }
}
7.2 JSON.parseObject(String text, Class<T> clazz)

将 JSON 字符串反序列化为 Java 对象。

 

import com.alibaba.fastjson.JSON;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"id\":1,\"name\":\"John Doe\"}";
        User user = JSON.parseObject(jsonString, User.class);
        System.out.println(user.getName()); // 输出:John Doe
    }
}
7.3 JSON.parseArray(String text, Class<T> clazz)

将 JSON 数组字符串反序列化为 List 对象。

import com.alibaba.fastjson.JSON;
import java.util.List;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";
        List<User> users = JSON.parseArray(jsonString, User.class);
        users.forEach(user -> System.out.println(user.getName())); // 输出:John Doe, Jane Doe
    }
}
7.4 JSON.toJavaObject(JSONObject jsonObject, Class<T> clazz)

JSONObject 转换为指定类型的 Java 对象。

 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class FastjsonExample {
    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", 1);
        jsonObject.put("name", "John Doe");

        User user = JSON.toJavaObject(jsonObject, User.class);
        System.out.println(user.getName()); // 输出:John Doe
    }
}
7.5 JSONObject

表示一个 JSON 对象。

  • put(String key, Object value):向 JSONObject 中添加键值对。
  • getString(String key):获取指定键的字符串值。
  • getIntValue(String key):获取指定键的整数值。
import com.alibaba.fastjson.JSONObject;

public class FastjsonExample {
    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", 1);
        jsonObject.put("name", "John Doe");

        String name = jsonObject.getString("name");
        int id = jsonObject.getIntValue("id");

        System.out.println("Name: " + name); // 输出:Name: John Doe
        System.out.println("ID: " + id);     // 输出:ID: 1
    }
}
7.6 JSONArray

表示一个 JSON 数组。

  • add(Object value):向 JSONArray 中添加元素。
  • getJSONObject(int index):获取指定索引处的 JSONObject
  • getString(int index):获取指定索引处的字符串值。
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    public class FastjsonExample {
        public static void main(String[] args) {
            JSONArray jsonArray = new JSONArray();
    
            JSONObject user1 = new JSONObject();
            user1.put("id", 1);
            user1.put("name", "John Doe");
    
            JSONObject user2 = new JSONObject();
            user2.put("id", 2);
            user2.put("name", "Jane Doe");
    
            jsonArray.add(user1);
            jsonArray.add(user2);
    
            JSONObject firstUser = jsonArray.getJSONObject(0);
            System.out.println(firstUser.getString("name")); // 输出:John Doe
        }
    }
    
    7.7 反序列化为泛型类型

 在反序列化时,如果要处理泛型类型,可以使用 TypeReference 来指定类型.

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
import java.util.Map;

public class FastjsonExample {
    public static void main(String[] args) {
        String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";

        // 使用 TypeReference 反序列化为泛型类型
        List<Map<String, Object>> userList = JSON.parseObject(jsonString, new TypeReference<List<Map<String, Object>>>() {});
        for (Map<String, Object> user : userList) {
            System.out.println(user.get("name"));
        }
    }
}

8.配置选项 

Fastjson 提供了许多配置选项,可以通过 SerializerFeatureParserConfig 来调整序列化和反序列化行为。

8.1 SerializerFeature

用于控制序列化的行为。

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

public class FastjsonExample {
    public static void main(String[] args) {
        User user = new User(1, "John Doe");
        String jsonString = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
        System.out.println(jsonString); // 空字符串字段会被序列化为空字符串,而不是 null
    }
}
8.2 ParserConfig

用于配置反序列化的行为,如注册自定义反序列化器。

import com.alibaba.fastjson.parser.ParserConfig;

public class FastjsonExample {
    public static void main(String[] args) {
        ParserConfig.getGlobalInstance().addAccept("com.example"); // 配置安全白名单
    }
}

 9.总结

  • 提供服务器端、安卓客户端两种解析工具,性能表现较好。
  • 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
  • 允许转换预先存在的无法修改的对象(只有class、无源代码)。
  • Java泛型的广泛支持。
  • 允许对象的自定义表示、允许自定义序列化类。
  • 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Fastjson是一个Java语言编写的高性能JSON处理框架,它提供了简单易用的API,可以实现Java对象和JSON字符串之间的相互转换。下面是一些关于Fastjson详解: 1. 特性:Fastjson具有较高的性能和较低的内存占用,支持全序列化和全反序列化,支持复杂对象、集合和泛型的序列化与反序列化,支持自定义序列化和反序列化处理逻辑,支持处理循环引用等。 2. 使用方法:Fastjson提供了简单易用的API,可以通过对象的toJsonString()方法将对象转换为JSON字符串,通过parseObject()方法将JSON字符串转换为对象。可以使用注解 @JSONField 进行字段级别的配置,还可以通过设置全局配置类 JSONConfig 来对Fastjson进行全局配置。 3. 序列化与反序列化:Fastjson可以将Java对象序列化为JSON字符串,也可以将JSON字符串反序列化为Java对象。在序列化过程中,Fastjson会自动根据对象的类型进行转换,并且支持复杂对象、集合和泛型等数据结构。在反序列化过程中,Fastjson会根据JSON字符串的结构自动将其转换为对应的Java对象。 4. 高级特性:Fastjson提供了一些高级特性,如支持处理循环引用,可以通过设置SerializerFeature.DisableCircularReferenceDetect来禁用循环引用检测;支持处理日期格式化,可以通过设置DateFormat来指定日期格式;支持处理泛型类型,可以通过TypeReference来指定泛型类型。 总的来说,Fastjson是一个功能强大、性能高效的JSON处理框架,在Java开发中被广泛使用。它简化了Java对象和JSON字符串之间的转换过程,并提供了丰富的功能和灵活的配置选项。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值