首页 前端知识 Java-阿里巴巴fastjson 使用

Java-阿里巴巴fastjson 使用

2024-07-01 23:07:54 前端知识 前端哥 633 844 我要收藏

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

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

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

目录

前言

特点

使用

序列化和反序列化

将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:

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

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 <=1.2.68

fastjson sec版本 <= sec9

android 版本不受此漏洞影响

3. 漏洞验证

  • 使用 JNDI 配合 RMI&LDAP 二阶注入或者字节码本地注入即可。
  • 字节码本地注入可以不受 JDK 修复限制且不受目标机器网络环境限制,此种利用方式对于攻击者更为有利。
  • 对于该漏洞,官方建议升级到最新版本 1.2.69 或更新的 1.2.70 版本,来规避相关的风险。
  • 项目地址:
  • https://github.com/alibaba/fastjson
  • fastjson 官方安全公告:

黑产与高危漏洞

随着网络技术不断升级,网络安全形势日益严峻。近年来,数据泄漏、网络敲诈等各类网络安全事件频发,给企业及社会发展带来严重影响。而这些在网络空间潜滋暗长的黑产,多数都与高危漏洞相关。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/13763.html
标签
评论
发布的文章

sublime text的json快捷键

2024-07-30 22:07:35

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!