🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客

Java阿里巴巴fastjson 使用

⭐每日一句:成为架构师路途遥远

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️

目录

前言

特点

使用

序列化和反序列化

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

将Java对象转Json字符串

修改JSON字段的值

添加新的字段

高级特性

案例

扩展-漏洞

1. 漏洞描述

2. 影响版本

3. 漏洞验证

黑产与高危漏洞


 

前言

  • 阿里巴巴fastjson是一个Java语言编写的开源的JSON解析器和生成器。它提供了一种快速、高效、灵活的处理JSON数据的方式,广泛应用于Java开发中。
  • 与其他JSON解析库相比,fastjson具有更快的解析速度和更低的内存消耗。它支持将Java对象序列化为JSON字符串,并且可以将JSON字符串反序列化为Java对象。同时,fastjson还支持对JSON数据的操作和转换,可以方便地对JSON数据进行增删改查等操作。

    github

     

    特点

    阿里巴巴的fastjson是一款高性能的JSON解析和序列化库,其实现原理主要包括以下几点:

    1. 采用Java的反射机制:fastjson使用Java的反射机制来解析JSON字符串,并将其转化为对应的Java对象。它通过读取对象的字段、方法和构造函数等信息来动态创建和操作对象。

    2. 内部数据结构:fastjson使用了自定义的数据结构来表示JSON数据。其中,JSON对象使用了JSONObject类来表示,它以一个Map来存储键值对;JSON数组使用了JSONArray类来表示,它以一个List来存储元素;JSON字符串、数字、布尔值等基本类型使用了相应的Java类型来表示。

    3. 解析算法:fastjson使用了递归下降解析算法来解析JSON字符串。它从字符串的起始位置开始,逐个字符地进行解析。在解析过程中,它会根据当前字符的类型进行不同的处理,例如,如果遇到{表示开始一个JSON对象,就会递归解析内部的键值对。

    4. 序列化算法:fastjson使用深度优先遍历算法将Java对象序列化为JSON字符串。在这个过程中,它会遍历对象的属性、字段和方法,并根据其类型来生成对应的JSON字符串。

    5. 高性能优化:fastjson进行了多项性能优化,使得它在解析和序列化JSON时具有很高的效率。例如,它会缓存解析过的类结构,避免重复解析;在序列化时,采用了一些技巧来减少内存分配和字符串拼接操作,提高效率。

    总的来说,fastjson通过反射机制解析JSON字符串并创建Java对象,使用自定义的数据结构表示JSON数据,采用递归下降算法进行解析,使用深度优先遍历算法进行序列化,并通过高性能优化来提高解析和序列化的效率。这些特点使得fastjson成为一款高性能的JSON库。

    使用

    使用阿里巴巴的fastjson可以按照以下步骤进行:

    添加依赖:在你的项目中添加fastjson的依赖。可以通过Maven或Gradle等构建工具来添加依赖,如下所示:

    Maven:

     com.alibaba fastjson 1.2.78 

    Gradle:

    implementation 'com.alibaba:fastjson:1.2.78' 

    导入类:在你的Java类中导入fastjson的相关类,如下所示:

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

    序列化和反序列化

    使用fastjson进行对象和JSON字符串之间的序列化和反序列化操作。例如,将Java对象序列化为JSON字符串:

    User user = new User("John", 25); String jsonString = JSON.toJSONString(user); 

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

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

    将Java对象转Json字符串

    User user = new User(); user.setId(1); user.setName("Alice"); user.setAge(25); String jsonString = JSON.toJSONString(user); System.out.println(jsonString); 

    JSON操作

    可以使用fastjson进行JSON数据的操作,例如获取字段值、修改字段值、添加新字段等。例如,获取JSON字段的值

    String jsonString = "{\"name\":\"John\",\"age\":25}"; JSONObject jsonObject = JSON.parseObject(jsonString); String name = jsonObject.getString("name"); int age = jsonObject.getIntValue("age"); 
    修改JSON字段的值
    jsonObject.put("age", 26); 
    添加新的字段
    jsonObject.put("gender", "Male"); 
    高级特性

    fastjson还提供一些高级特性,如自定义序列化和反序列化过程、配置项的设置等。例如,关闭循环引用检测:

    JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask(); 

    以上是快速了解阿里巴巴fastjson的基本使用方法,你可以根据具体需求深入学习和使用fastjson的更多功能和特性。

    案例

    下面是一个使用阿里巴巴的fastjson库的简单示例:

    import com.alibaba.fastjson.JSON; public class FastJsonExample { public static void main(String[] args) { // 将JSON字符串转换为Java对象 String jsonStr = "{\"id\": 1, \"name\": \"Alice\", \"age\": 25}"; User user = JSON.parseObject(jsonStr, User.class); System.out.println("User details:"); System.out.println("ID: " + user.getId()); System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); // 将Java对象转换为JSON字符串 User newUser = new User(); newUser.setId(2); newUser.setName("Bob"); newUser.setAge(30); String jsonString = JSON.toJSONString(newUser); System.out.println("JSON string: " + jsonString); } } class User { private int id; private String name; private int age; // getter and setter methods 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; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

    这个例子演示了如何将JSON字符串转换为Java对象,以及如何将Java对象转换为JSON字符串。在示例中,先通过JSON.parseObject()将JSON字符串转换为User对象,然后打印出对象的属性。然后,创建一个User对象,并使用JSON.toJSONString()将其转换为JSON字符串。最后打印出JSON字符串。

    请确保在使用该示例时,已将fastjson库添加到项目的依赖中。

    扩展-漏洞

    1. 漏洞描述

    fastjson 采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化 Gadgets 类时,在 autoType 关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过 autoType 限制,风险影响较大。阿里云应急响应中心提醒 fastjson 用户尽快采取安全措施阻止漏洞攻击。

    2. 影响版本

    fastjson

微信扫一扫