Java中Gson反序列化返回全Null值问题求助
解决Gson反序列化JSON后所有字段为null的问题
遇到这种全字段为null的情况,通常是几个常见细节没处理好,我给你逐一排查解决:
1. 实体类字段和JSON键必须匹配(或用注解映射)
首先要确保你的实体类字段名和JSON里的键完全一致,或者用@SerializedName注解做映射。比如针对你的JSON结构,正确的实体类应该是这样:
public class AdEntity { private String cpm; private int id; private String name; private String startDate; // 重点!必须要有公共无参构造函数,Gson靠它实例化对象 public AdEntity() {} // 可选但建议:添加getter/setter方法(如果字段是private的话) public String getCpm() { return cpm; } public void setCpm(String cpm) { this.cpm = cpm; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } }
如果你的实体类字段名和JSON键不一样(比如把startDate写成start_date),就用注解指定映射关系:
@SerializedName("startDate") private String start_date;
2. 确保完整读取了整个JSON字符串
你的代码里用了StringBuilder但没写完,一定要把输入流的所有内容拼接完整,否则Gson解析不完整的JSON会导致结果异常。正确的读取代码应该是:
Gson g = new Gson(); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuilder responseBuilder = new StringBuilder(); // 循环读取每一行,直到流结束 while ((inputLine = in.readLine()) != null) { responseBuilder.append(inputLine); } in.close(); // 记得关闭流,避免资源泄漏 // 把拼接好的字符串转成实体类列表 List<AdEntity> adList = g.fromJson(responseBuilder.toString(), new TypeToken<List<AdEntity>>(){}.getType());
3. 反序列化时要指定正确的泛型类型
因为你的JSON是一个数组结构,不能直接用AdEntity.class来解析,必须用TypeToken来获取List<AdEntity>的泛型类型,否则Gson无法识别数组,会导致解析出的对象全为null或者类型不匹配的错误。
4. 检查实体类是否有公共无参构造函数
如果你的实体类只写了带参数的构造函数,没有显式声明无参构造函数,Gson没办法创建对象实例,自然所有字段都是null。所以一定要加上公共的无参构造函数(如果你的类没有任何构造函数,Java会默认生成,但只要有带参构造,就必须显式写无参的)。
5. 验证读取到的JSON是否完整正确
可以在解析前把读取到的JSON字符串打印出来,确认它和你给出的示例完全一致,没有语法错误(比如引号缺失、逗号错误等):
System.out.println("读取到的JSON:" + responseBuilder.toString());
按照上面的步骤逐一排查,应该就能解决反序列化后字段全为null的问题了。
内容的提问来源于stack exchange,提问作者Ftwpker
相关产品推荐
相关产品推荐

