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
相关产品推荐
相关产品推荐

