如何使用Gson将JSON字符串转换为Java对象?含报错排查
解决Gson解析报错:Expected BEGIN_OBJECT but was BEGIN_ARRAY
这个报错我之前也碰到过,咱们一步步拆解问题解决:
问题根源
你的报错本质是JSON结构和实体类的映射完全不匹配,导致Gson无法正确解析:
- 服务器返回的JSON中,数组对应的键是
games,但你的Deneme类里定义的字段是matches,Gson默认按字段名匹配,自然找不到对应数据; - 直接用
List<JsonObject>来接收数组元素不够规范,也容易引发类型解析错误。
解决方案
我们需要调整实体类结构,让它和JSON结构完全对应:
1. 创建对应单个游戏对象的实体类
新建Game.java,用来映射JSON数组里的每个对象:
public class Game { private String game; private double probability; // 注意:Gson需要无参构造函数来实例化对象,必须加上 public Game() {} // Getter和Setter方法 public String getGame() { return game; } public void setGame(String game) { this.game = game; } public double getProbability() { return probability; } public void setProbability(double probability) { this.probability = probability; } }
2. 修改Deneme.java的字段映射
把字段名改成和JSON里的games一致,同时把类型换成List<Game>:
import java.util.List; public class Deneme { // 字段名和JSON的键完全匹配 private List<Game> games; public List<Game> getGames() { return games; } public void setGames(List<Game> games) { this.games = games; } }
3. 保留原字段名的替代方案(可选)
如果你不想改matches这个字段名,可以用Gson的@SerializedName注解来指定对应的JSON键,这样也能完成映射:
import com.google.gson.annotations.SerializedName; import java.util.List; public class Deneme { @SerializedName("games") // 指定JSON中的键名 private List<Game> matches; public List<Game> getMatches() { return matches; } public void setMatches(List<Game> matches) { this.matches = matches; } }
4. 执行解析代码
现在你的原解析代码就能正常工作了:
Gson gson = new Gson(); Deneme obj = gson.fromJson(result, Deneme.class);
这样调整后,Gson就能正确识别JSON结构,把games数组映射到对应的List字段里,报错也就解决了。
内容的提问来源于stack exchange,提问作者sneijder10
相关产品推荐
相关产品推荐

