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

Android中Retrofit动态数组解析报错:期望Object却找到数组

解决JSON解析报错:expected Object but found array

看起来你在解析JSON时遇到了类型不匹配的问题,我来帮你梳理下问题所在和修复方案。

首先,先分析你的代码里几个关键问题:

  • 你的内部类recent_overs_str没有声明为静态内部类,大多数JSON解析库(比如Gson、Jackson)无法直接实例化非静态内部类,因为它们需要依赖外部类的实例。
  • 字段定义recent_overs_str[] recent_overs_str存在类名和变量名重复的问题,这不仅容易混淆,也可能导致解析器无法正确映射类型。
  • 注解@SerializedName的使用位置虽然没问题,但整体嵌套结构的定义可能和实际的JSON结构不匹配,导致解析器把数组当成了对象来处理。

修复后的POJO结构示例

假设你用的是Gson,我们来重构你的POJO:

public class MatchFullCardResponse {
    // 对应外层的data字段
    @SerializedName("data")
    private Data data;

    // getter和setter
    public Data getData() { return data; }
    public void setData(Data data) { this.data = data; }

    // 静态内部类Data
    public static class Data {
        @SerializedName("card")
        private Card card;

        public Card getCard() { return card; }
        public void setCard(Card card) { this.card = card; }

        // 静态内部类Card
        public static class Card {
            @SerializedName("now")
            private Now now;

            public Now getNow() { return now; }
            public void setNow(Now now) { this.now = now; }

            // 静态内部类Now
            public static class Now {
                // 这里用List或者数组都可以,推荐List更灵活
                @SerializedName("recent_overs_str")
                private List<RecentOversStr> recentOversStrList;

                // 或者用数组:private RecentOversStr[] recentOversStrArray;

                public List<RecentOversStr> getRecentOversStrList() { return recentOversStrList; }
                public void setRecentOversStrList(List<RecentOversStr> recentOversStrList) { this.recentOversStrList = recentOversStrList; }

                // 静态内部类,类名采用大驼峰命名规范,避免和变量名混淆
                public static class RecentOversStr {
                    // 这里添加你需要的字段,比如假设JSON里有overs、score等字段
                    @SerializedName("overs")
                    private String overs;
                    @SerializedName("score")
                    private String score;

                    // getter和setter
                    public String getOvers() { return overs; }
                    public void setOvers(String overs) { this.overs = overs; }
                    public String getScore() { return score; }
                    public void setScore(String score) { this.score = score; }
                }
            }
        }
    }
}

关键修复点说明

  1. 静态内部类:所有嵌套的实体类都声明为static,这样解析库可以直接创建它们的实例,不需要依赖外部类对象。
  2. 命名规范:类名用大驼峰(RecentOversStr),变量名用小驼峰(recentOversStrList),避免类名和变量名重复,提升代码可读性。
  3. 类型匹配:如果JSON中的recent_overs_str是数组类型,POJO中对应字段要用List<实体类>或者实体类[]来接收,确保和JSON的类型一致——这正是你之前报错的核心原因:解析器预期对象,但实际拿到了数组。

解析示例(以Gson为例)

String json = "你的JSON字符串";
MatchFullCardResponse response = new Gson().fromJson(json, MatchFullCardResponse.class);
// 访问recent_overs_str数据
List<MatchFullCardResponse.Data.Card.Now.RecentOversStr> recentOvers = response.getData().getCard().getNow().getRecentOversStrList();

这样调整后,应该就能解决expected Object but found array的报错了。

内容的提问来源于stack exchange,提问作者Mugdha Kaushik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:05:36