fastjson反序列化基础

220 篇文章 7 订阅
213 篇文章 3 订阅

https://github.com/mbechler/marshalsec

fastjson反序列化

fastjson三种反序列化方式的差异

参考:
https://xz.aliyun.com/t/7027
在这里插入图片描述

1、返回结果的对象类型不同

说明:
使用

JSON.parse(serializedStr);

或者

JSON.parseObject(serializedStr);    // 不指定具体类

得到的对象为com.alibaba.fastjson.JSONObject类型,也就是json字符串。
使用

JSON.parseObject(serializedStr,User.class);   // 指定具体类,这里为com.cqq.User类

得到的对象类型为com.cqq.User

PS:查看JSON.parseObject的具体实现,发现其实最终还是调用了JSON.parse
在这里插入图片描述
//TODO 后续再深入

2、执行过程中调用的方法不同

使用FastJsonTest进行测试,发现在反序列化中调用的方法不同。
在这里插入图片描述
发现这三种方式都会调用目标类的set方法,但是只有

JSON.parseObject(payload);

会调用目标类的get方法。
调用栈如下:
在这里插入图片描述
就是因为parseObject比其他方式多了一个toJSON操作。因为要得到json数据,就得调用目标类的get方法,拿到这个对象的某个属性值。
在这里插入图片描述

@type字段的使用

其实就是JSON.toJSONString方法多加一个参数。之前是:

String serializedStr = JSON.toJSONString(user1);

在这里插入图片描述
现在改成

String serializedStr = JSON.toJSONString(user1, SerializerFeature.WriteClassName);

在这里插入图片描述

使用Person类进行反序列化实验

测试代码如下:

package com.cqq;

import com.alibaba.fastjson.JSON;

public class Type {

    public static void main(String[] args) {
        String eneity3 = "{\"@type\":\"com.cqq.Person\", " +
                "\"name\":\"cqq\", \"full_name\":\"caiqiqi\", " +
                "\"age\": 18, \"prop\": {\"123\":123}, \"sex\": 1}";
        //反序列化
        Object obj = JSON.parseObject(eneity3, Person.class);
        //输出会调用obj对象的toString函数
        System.out.println(obj);
    }
}

Person类内容如下:

package com.cqq;

import java.util.Properties;

public class Person {
    //属性
    public String name;
    private String full_name;
    private int age;
    private Boolean sex;
    private Properties prop;
    //构造函数
    public Person(){
        System.out.println("[*] Person构造函数");
    }
    //set
    public void setAge(int age){
        System.out.println("[*] setAge()");
        this.age = age;
    }
    //get 返回Boolean
    public Boolean getSex(){
        System.out.println("[*] getSex()");
        return this.sex;
    }
    //get 返回ProPerties
    public Properties getProp(){
        System.out.println("[*] getProp()");
        return this.prop;
    }
    //在输出时会自动调用的对象ToString函数
    public String toString() {
        String s = "[Person Object] name=" + this.name
                + " full_name=" + this.full_name  + ", age=" + this.age
                + ", prop=" + this.prop + ", sex=" + this.sex;
        return s;
    }
}

在这里插入图片描述
从结果看,发现只有name和age被解析出来了。猜想分析:
1、对比name和full_name,他们的值在json数据中都指定了,而且Person类中都没有他们的set和get方法,但是name属性是public的,而full_name属性是private的。
2、age内容被输出,发现setAge()被调用了。
3、虽然getProp()方法也被调用了,但是由于prop属性是private的,且没有相应的set方法,无法将json字符串中的值赋值给对象。

然而并不是这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fastjson是一个Java语言编写的高性能JSON处理库,可以实现JSON字符串与Java对象之间的相互转换。在Fastjson中,反序列化就是将JSON字符串转换为Java对象的过程。 要进行Fastjson反序列化,首先需要将JSON字符串作为输入,然后使用Fastjson提供的API将其转换为Java对象。以下是一个简单的示例代码: ```java import com.alibaba.fastjson.JSON; public class FastjsonExample { public static void main(String[] args) { String jsonString = "{\"name\":\"Alice\",\"age\":25}"; // 将JSON字符串反序列化为Java对象 Person person = JSON.parseObject(jsonString, Person.class); System.out.println(person.getName()); // 输出:Alice System.out.println(person.getAge()); // 输出:25 } } class Person { private String name; private int age; // 省略构造函数和其他方法 // Getter和Setter方法 } ``` 在上述示例中,首先定义了一个Person类,该类包含了name和age两个属性。然后,使用`JSON.parseObject`方法将JSON字符串`jsonString`反序列化为Person对象。 需要注意的是,Fastjson会根据属性名匹配JSON中的字段,并将对应字段的值赋给属性。因此,在进行反序列化时,要确保Java类的属性名与JSON中的字段名一致,或者使用`@JSONField`注解来指定字段名和属性名之间的映射关系。 以上就是使用Fastjson进行反序列化的基本步骤和示例代码。希望能对你有所帮助!如果有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值