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; } } } } } }
关键修复点说明
- 静态内部类:所有嵌套的实体类都声明为
static,这样解析库可以直接创建它们的实例,不需要依赖外部类对象。 - 命名规范:类名用大驼峰(
RecentOversStr),变量名用小驼峰(recentOversStrList),避免类名和变量名重复,提升代码可读性。 - 类型匹配:如果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
相关产品推荐
相关产品推荐

