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

如何使用Gson将JSON字符串转换为Java对象?含报错排查

解决Gson解析报错:Expected BEGIN_OBJECT but was BEGIN_ARRAY

这个报错我之前也碰到过,咱们一步步拆解问题解决:

问题根源

你的报错本质是JSON结构和实体类的映射完全不匹配,导致Gson无法正确解析:

  1. 服务器返回的JSON中,数组对应的键是games,但你的Deneme类里定义的字段是matches,Gson默认按字段名匹配,自然找不到对应数据;
  2. 直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:20:43