Skip to content

[Bug] Custom getter causes empty string deserialized to null in 2.0.57 #3537

@egg-li

Description

@egg-li

问题描述

在反序列化 JSON 数据时,若目标类中存在自定义 get 方法且 JSON 中字符串字段值为空字符串(""),Fastjson2 会错误地将其反序列化为 null。此行为与预期不符,且可能导致 NPE 风险。

环境信息

  • OS信息: [e.g. macOS apple m1 pro 16 GB]
  • JDK信息: [e.g.:Openjdk 17]
  • 版本信息:[e.g.:Fastjson2 2.0.57]

重现步骤

如何操作可以重现该问题:

  1. 定义一个包含自定义 get 方法的类(如 SimpleTestValue)。
  2. 反序列化包含空字符串字段的 JSON(如 {"value": ""})。
  3. 观察字段值被错误转为 null。
public static void main(String[] args) {
        class SimpleTestValue {
            private Object value;

            // 标准 getter/setter
            public Object getValue() {
                return value;
            }
            public void setValue(Object value) {
                this.value = value;
            }

            // 自定义 getter 会导致问题
            public List<String> getRelates() {
                return List.of("1", "2");
            }
        }

        String json = "{\"value\":\"\"}";
        SimpleTestValue s = JsonUtil.fromJSON(json, SimpleTestValue.class);
        System.out.println(s.getValue() == null);
    }

期待的正确结果

空字符串 "" 应被反序列化为 Java 的空字符串(""),而非 null。此行为应与无自定义 get 方法时的逻辑一致。

相关日志输出

无错误日志,但反序列化结果异常:

true  // s.getValue() == null

附加信息

对比测试:若移除 getRelates() 方法,反序列化结果正常(s.getValue() 为 "")。
影响范围:所有带自定义 get 方法的类均可能触发此问题。
临时解决方案:暂时避免在目标类中添加非标准 get 方法

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingfixed

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions