fastjson 踩坑记:对下划线字段智能匹配

内容纲要

背景

昨天刚发了个版本,今天就有用户投诉,测试同学验证后发现确有问题,回退到上个版本就没问题了

具体来说,就是用户自定义了广告创意的落地页,但是我们没有用他自定义的落地页,而是采用了默认的落地页

这就奇怪了,这次新版本根本没有动过相关的代码,让人头大

经过研究发现,是因为我把 fastjson 的版本从 1.2.70 升级到了 1.2.76

fastjson

在 1.2.70 及之前的版本,fastjson 会对下划线字段进行智能匹配,啥意思呢?举个例子说明下

{"user_id": 100}

对应的 java bean 如下

public class User {

    @JSONField(name = "user_id")
    private Integer userId;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public static void main(String[] args) {
        String json = "{\"userId\": 100}";
        User user = JSON.parseObject(json, User.class);
        System.out.println(user.getUserId());
    }
}

由于 json 的 key user_id 和 javabean 的属性名 userId 不一样,我们会用 @JSONField(name = "user_id") 注解来指定映射关系

fastjson 1.2.70 及之前版本,即使指定了 javabean 的 userId 映射到 json 的 user_id,但是如果 json 里有 userId 的 key,也能映射到 javabean 的 userId,执行 main 方法将打印出 100

fastjson 升级到 1.2.71 时,不再支持这种映射,上述 main 方法将打印 null

问题原因

我们的 json 里某个字段之前是下划线分隔的,后来在某次版本里修改成了驼峰格式,就类似 user_id 改成了 userId,这样新版本以后创建的数据是驼峰格式,而一些历史数据还是下划线格式的

当时的 fastjson 是 1.2.70,无论下划线还是驼峰格式都兼容,所以一直没有问题,这次新版本我想着 fastjson 早期版本有安全隐患,升级到最新版可能会更安全,结果测试时可能刚好测试数据是下划线格式的,没有出问题;发布到生产环境后,遇到驼峰格式的数据就出问题了

真是个坑啊

fastjson 踩坑记:对下划线字段智能匹配

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
粤ICP备2020114259号 粤公网安备44030402004258