使用Java Gson解析RunSignUp API返回JSON时字段为空求助
看起来你遇到的是Gson字段映射不匹配的典型问题,我来帮你分析下可能的原因和解决办法:
先排查最常见的问题:JSON结构和实体类不匹配
你提到API返回的JSON内容正常,但有没有注意到返回的顶层结构?很多REST API会把数据包裹在一层results或者data对象里,比如可能返回的JSON是这样的:
{
"results": {
"races": [
{"race_id": 12345, "name": "City Marathon"},
...
]
}
}
而你的RaceList类直接定义了private List<Race> races;,Gson找不到顶层的races字段,自然就会生成默认值的对象。这时候你需要调整RaceList的结构来匹配JSON的嵌套层级:
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class RaceList { private Results results; // 内部类对应JSON里的results对象 @Data public static class Results { private List<Race> races; } }
给字段添加@SerializedName注解确保精确映射
即使字段名看起来完全一致,有时候Gson的默认映射规则可能因为Lombok的生成逻辑、隐式的命名转换出现问题。给Race类的字段加上@SerializedName注解可以强制指定JSON字段名,彻底避免映射歧义:
package stefanowicz.kacper.model; import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor @Builder public class Race { @SerializedName("race_id") private long race_id; @SerializedName("name") private String name; }
额外检查:字段类型是否匹配
如果JSON里的race_id是字符串类型(比如"race_id": "6789"),而你的Java字段是long类型,Gson虽然会尝试自动转换,但如果转换失败就会设为默认值0。你可以看看打印的JSON里race_id是数字还是字符串,如果是字符串,要么把Java字段改成String类型,要么自定义类型适配器处理转换。
快速验证小技巧
你可以把API返回的JSON复制出来,用在线JSON转Java类的工具生成对应的实体类,对比一下和你自己写的RaceList、Race有什么差异,很快就能定位到结构不匹配的地方。
按照上面的步骤调整后,应该就能正常映射字段了!
内容的提问来源于stack exchange,提问作者Kacper1098

