fastjson底层分析

nn0nkey   ·   发表于 2024-10-08 19:44:52   ·   技术文章

fastjson底层分析

前言

我们平常不得不了解一种数据就是json数据,而在java中,处理这数据的两种主流的一种是fastjson,一种是jackson

简单给大家说一下他们两个

fastjson

https://github.com/alibaba/fastjson

Fastjson 是一个 Java 库,可用于将 Java 对象转换为 JSON 表示形式。它还可用于将 JSON 字符串转换为等效的 Java 对象。Fastjson 可以处理任意 Java 对象,包括您没有源代码的现有对象。

可以通过maven


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

JACKSON

Jackson 是一个用于处理 JSON 数据的 Java 库,它能够将 Java 对象与 JSON 之间进行转换(序列化和反序列化)。Jackson 提供了多个模块,能够灵活地处理各种数据格式和需求

可以通过maven

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.9</version>
        </dependency>

因为我主要讲讲fastjson,这里就简单介绍了

测试代码

import com.fasterxml.jackson.databind.ObjectMapper;

public class Example {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User("John", 30);
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);

        String jsonInput = "{\"name\":\"John\",\"age\":30}";
        User deserializedUser = objectMapper.readValue(jsonInput, User.class);
        System.out.println(deserializedUser.getName());
    }
}
class User {
    private String name;
    private int age;

    public User() {}
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    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;
    }
}

输出的结果分别为

{"name":"John","age":30}
John

为什么需要了解底层

fastjson可以说是国内用得比较多的了,比如很火的若依系统里面,就有我们的fastjson



可以看到用了许许多多fastjson去解析json数据

但是fastjson的漏洞随着版本的迭代,不同的绕过手法一直在更新,其中的绕过都是从底层中找到的,所以在这里给大家分析一下fatsjon到底是如何解析json数据的,才能更好的学习fastjson,而且fastjson也是java安全必学的一部分,面试几乎都会问到

底层调试分析

调试代码

package demo2;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}
package demo2;

import com.alibaba.fastjson.JSON;
public class FastjsonTest {
    public static void main(String[] args) {
        Person person = new Person("LJL", 18);
        String jsonString = JSON.toJSONString(person);//当然还有很多方法,这个不重要
        System.out.println(jsonString);
    }
}

过程分析

我们在String jsonString = JSON.toJSONString(person);这里下断点

跟进来到一堆重载的方法,根据你传入参数的类型来选择方法

更多内容已被隐藏
主题内容你需要付费可见 (点击购买) 售价:5 金币
用户名金币积分时间理由
Track-魔方 100.00 0 2024-11-07 20:08:56 本月首次发表一篇有效文章奖励 100
Track-魔方 500.00 10 2024-11-07 20:08:36 深度 200 普适 200 可读 100

打赏我,让我更有动力~

7 条回复   |  直到 1个月前 | 183 次浏览

小瑟斯
发表于 1个月前

瑞思拜

评论列表

  • 加载数据中...

编写评论内容

玄天
发表于 1个月前

fastjson

评论列表

  • 加载数据中...

编写评论内容

学kali的小白
发表于 1个月前

学习了

评论列表

  • 加载数据中...

编写评论内容

1198950962
发表于 1个月前

1

评论列表

  • 加载数据中...

编写评论内容

sgrzhou
发表于 1个月前

1

评论列表

  • 加载数据中...

编写评论内容

马小芳
发表于 1个月前

tql

评论列表

  • 加载数据中...

编写评论内容

fan
发表于 1个月前

fastjson

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.