You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fastjson反序列化返回null/0异常:代码问题排查咨询

Fastjson反序列化返回null/0的问题分析与修复

我来帮你拆解下问题所在,你的代码主要有几个核心问题导致反序列化后无法正确获取JSON中的值:

1. 缺少Setter方法

Fastjson默认依赖Setter方法来完成反序列化时的字段赋值(除非字段被设为public,或者使用注解显式指定字段映射)。你的fileinfo类只定义了Getter方法,没有对应的Setter,导致Fastjson无法将JSON中的值注入到类的私有字段中,最终字段保持Java的默认值:String类型为null,int类型为0。

2. Getter方法命名不符合JavaBean规范

JavaBean规范要求Getter方法的命名格式为get[字段名首字母大写],Fastjson会根据这个规则来关联JSON键和Java字段。你的代码里:

  • 字段Type对应的Getter是getfiletype(),正确的命名应该是getType()
  • 字段File_Size对应的Getter是getfilesize(),正确的命名应该是getFile_Size()
    命名不匹配会导致Fastjson无法正确识别字段与JSON键的对应关系,即使字段被赋值,也无法通过错误的Getter拿到正确内容。

3. 类名与字段名的命名不规范(可选优化)

虽然这不是直接导致问题的原因,但Java开发中类名首字母大写、字段名使用驼峰命名是通用规范,这样能避免大小写敏感带来的潜在问题,也让代码更易读。


修正后的代码示例

下面是遵循规范且能正常反序列化的代码:

方式一:使用驼峰命名+规范Getter/Setter

import com.alibaba.fastjson.JSON;

public class JsonDeserializeDemo {
    public static void deserializeJson(String json) {
        FileInfo fileInfo = JSON.parseObject(json, FileInfo.class);
        System.out.println(fileInfo.getType());
        System.out.println(fileInfo.getFileName());
        System.out.println(fileInfo.getFileSize());
    }

    public static void main(String[] args) {
        String json = "{\"Type\": \"File\", \"File_Name\": \"tempfile.fasttext\", \"File_Size\": 15}";
        deserializeJson(json);
    }
}

class FileInfo {
    // 驼峰命名字段
    private String type;
    private String fileName;
    private int fileSize;

    // 显式声明无参构造函数(Fastjson反序列化时建议添加)
    public FileInfo() {}

    // 规范的Getter和Setter
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public int getFileSize() {
        return fileSize;
    }

    public void setFileSize(int fileSize) {
        this.fileSize = fileSize;
    }
}

方式二:保留原字段名,使用@JSONField注解指定映射

如果你想保持字段名和JSON键完全一致(带下划线),可以使用Fastjson的@JSONField注解显式指定对应关系:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;

public class JsonDeserializeDemo {
    public static void deserializeJson(String json) {
        FileInfo fileInfo = JSON.parseObject(json, FileInfo.class);
        System.out.println(fileInfo.getType());
        System.out.println(fileInfo.getFile_Name());
        System.out.println(fileInfo.getFile_Size());
    }

    public static void main(String[] args) {
        String json = "{\"Type\": \"File\", \"File_Name\": \"tempfile.fasttext\", \"File_Size\": 15}";
        deserializeJson(json);
    }
}

class FileInfo {
    @JSONField(name = "Type")
    private String Type;
    @JSONField(name = "File_Name")
    private String File_Name;
    @JSONField(name = "File_Size")
    private int File_Size;

    public FileInfo() {}

    public String getType() {
        return Type;
    }

    public void setType(String type) {
        Type = type;
    }

    public String getFile_Name() {
        return File_Name;
    }

    public void setFile_Name(String file_Name) {
        File_Name = file_Name;
    }

    public int getFile_Size() {
        return File_Size;
    }

    public void setFile_Size(int file_Size) {
        File_Size = file_Size;
    }
}

运行上面的代码,就能正确输出JSON中的值了。

内容的提问来源于stack exchange,提问作者peter_pei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:58:10