Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >又被 fastjson 坑了?它调用了我自定义的 get 方法!

又被 fastjson 坑了?它调用了我自定义的 get 方法!

作者头像
明明如月学长
发布于 2023-05-19 07:38:42
发布于 2023-05-19 07:38:42
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

一、背景

最近看到又有同学被 fastjson 坑了。 该同学在类中自定义了 get 方法,在该 get 方法中引用了一个对象,由于某段代码中 “没有用到”该方法就没注入,最后出现了空指针。 由于自己确定没有主动调用这个方法,排查了半天,借助 arthas 看 trace 才发现这个坑。

二、问题复现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class Student {

    private String name;

    public String getValue() {
        return "test";
    }
}

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StudentDemo {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Student");

        System.out.println(JSON.toJSONString(student));
    }
}

结果是:{“name”:“Student”,“value”:“test”}

可见 fastjson 的 toJSONString 方法转 JSON 时,底层是通过解析 get 方法来识别属性的,它认为有一个 value 属性,转为 JSON 字符串时会自动调用对应的 get 方法获取 value 属性的值。

如果自定义的 get 方法中使用到了尚没有设置的对象,由于并没有显示调用 getAddress 方法,很多人并不会意识到需要注入 repository 对象,如果调用了 toJSONString 方法就极容易出现空指针异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class Student {

    private String name;

    private String addressId;

    private AddressRepository repository;


    // 省略其他
    public Address getAddress() {
        return repository.get(addressId);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StudentDemo {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Student");
        student.setAddressId("10086");

        // 很多人并不会意识到这里会自动调用 getAddress 方法,因此没有设置  repository,空指针了!
        log.info("过程中某个日志, 参数:{}", JSON.toJSONString(student));
    }
}

三、如何解决

方法一:自定义的方法避免定义为 get 开头。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class Student {

    private String name;


    public String fetchValue() {
        return "test";
    }
}

方法二:使用 @JSONField(serialize = false) 在 getValue 方法上,让 fastjson 忽略该方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class Student {

    private String name;

    @JSONField(serialize = false)
    public String getValue() {
        return "test";
    }
}

四、启发

大家在进行项目开发时,当你发现对象转 JSON 字符串时“莫名其妙地”多出了某些属性,其实就是这个原因。 大家在使用 fastjson 将对象转为 JSON 字符串时一定要小心这个坑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/05/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FastJson详解
FastJson 是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Java微观世界
2025/01/21
4170
FastJson基本使用
5、注解属性 : deserialize 指定是否反序列化该字段,默认为 true
兮动人
2022/09/26
8960
Fastjson 使用
fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean序列化为JSON字符串,也可以从 JSON 字符串反序列化到 JavaBean。
acc8226
2022/05/17
2.2K0
阿里fastjson框架基础
fastjson 是阿里巴巴公司开源的一个json序列化、反序列化轻量级框架,号称最快。 是因为其内置算法的增强,以及序列化时对class进行了细节的微妙处理,更多细节请查看其项目源码:https://github.com/alibaba/fastjson 常用方法示例:
青山师
2023/05/05
3330
fastjson对接口参数的某个字段不打印输出,如文件的base64字符串
oktokeep
2024/10/09
2330
json字符串忽略null,忽略字段,首字母大写等gson,jackson,fastJson实现demo,T data JSON.parseObject json转换
json字符串忽略null,忽略字段,首字母大写等gson,jackson,fastJson实现demo
oktokeep
2024/10/09
3450
Json字符串转换处理html编码格式,= \u003d 处理
oktokeep
2024/10/09
2250
FastJson 笔记
观察该类的继承与实现关系,不难发现,JSONObject 实现了 Map 接口,而 json 对象中的数据都是以”键:值”对形式出现,可以猜想, JSONObject 底层操作是由Map实现的。
Remember_Ray
2020/03/09
4.7K0
JSON.toJSONString 首字母不小写
import com.alibaba.fastjson.annotation.JSONField;
Java架构师必看
2021/11/29
1.1K0
前后端分离使用Jackson或者fastjson解决后端忽略实体类中的某个属性不返回给前端的方法
接收到的需求:我们前端只需要id、name、gender,phone不需要给前端。 一开始想法直接重新写一个VO,属性里去掉phone,这样一下多了个文件,显然不是我们想要的!接下来教你两种方式实现一下哦!!
掉发的小王
2022/07/11
2.9K0
前后端分离使用Jackson或者fastjson解决后端忽略实体类中的某个属性不返回给前端的方法
走进Java接口测试之fastjson指南
在上文 走进Java接口测试之理解JSON和XML基础 我们介绍了 JSON 的基础知识,本文我们深入研究阿里巴巴的开源 JSON 解析库 fastjson。
高楼Zee
2019/07/17
1.6K0
fastJson注解@JSONField 的作用及其效果「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127524.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/31
1.3K0
fastJson注解@JSONField 的作用及其效果「建议收藏」
fastjson2使用
在下是首席架构师
2024/07/16
2480
fastjson2使用
JSONObject应用Json字符串和Object对象之间的转换,Map封装数据思路
JSONObject应用Json字符串和Object对象之间的转换,Map封装数据思路
oktokeep
2024/10/09
2480
fastJson的JSONField注解
然后是deserialize:默认为true,如果为false,反序列化时会忽略该属性
阿超
2022/08/16
1.6K0
fastJson的JSONField注解
fastjson 注解(JAVA注解)
查看@JSONField注解的源码可以了解到它的作用范围是在方法(METHOD)、属性(FIELD)、方法中的参数(PARAMETER)上。
全栈程序员站长
2022/07/25
2.2K0
FastJson中@JSONField注解使用
最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。
全栈程序员站长
2022/11/01
1.4K0
使用JSON.parseObject 对象与MAP之间的转换
oktokeep
2024/10/09
3840
fastjson详解
  fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
良辰美景TT
2018/09/11
3.5K0
fastjson详解
Mson,让JSON序列化更快
本文由秦喆 芝任 天洲 赵鹏四位作者共同完成。 问题 我们经常需要在主线程中读取一些配置文件或者缓存数据,最常用的结构化存储数据的方式就是将对象序列化为JSON字符串保存起来,这种方式特别简单而且可以
美团技术团队
2018/03/13
2.2K0
Mson,让JSON序列化更快
相关推荐
FastJson详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验