如何为嵌套JSON创建POJO以通过Retrofit获取响应(排查空数据问题)
解决Retrofit解析嵌套JSON数据为空的问题
你遇到的问题出在POJO类的结构和JSON字段映射不匹配,完全不需要修改JSON,只需要调整POJO代码就能解决。咱们先理清楚问题根源,再给出修正后的代码:
问题分析
先看你的原始JSON结构(核心是分类对应二维菜品数组):
{ "Category_Name": [ "Breads", "Combo and Thali", "Main Course", "Rice and Biryani" ], "Alldishitems": [ [ { "Subcategory": "Brown bread", "DishName": "Stuffed Paratha", "DishPrice": "100", "Dishquantity": "10", "Dishdescription": "" }, { "Subcategory": "white Bread", "DishName": "Plain Paratha", "DishPrice": "136", "Dishquantity": "10", "Dishdescription": "" } ], [ { "Subcategory": "Combo", "DishName": "Rajma Masala Combo", "DishPrice": "136", "Dishquantity": "10", "Dishdescription": "" }, { "Subcategory": "Combo", "DishName": "Lassi with Aloo Paratha", "DishPrice": "100", "Dishquantity": "10", "Dishdescription": "" }, { "Subcategory": "Thali", "DishName": "Chinise thali", "DishPrice": "100", "Dishquantity": "10", "Dishdescription": "" } ] ] }
你写的Getmenulist类犯了两个关键错误:
- 多余嵌套了一层
Getmenudata,还加了@SerializedName("Alldishitems")——但JSON里的Alldishitems直接是菜品对象的二维数组,根本没有额外的data字段,导致Retrofit找不到对应数据 - 没有给POJO类添加无参构造方法,Gson解析时需要无参构造来实例化对象,这也是导致解析失败的隐形原因
修正后的POJO代码
1. 顶级响应类 ServerResponse
import com.google.gson.annotations.SerializedName; import java.util.ArrayList; public class ServerResponse { @SerializedName("Category_Name") private String[] categoryNames; @SerializedName("Alldishitems") private ArrayList<ArrayList<Dish>> allDishItems; // 必须添加无参构造,Gson解析需要 public ServerResponse() {} // Getter方法 public String[] getCategoryNames() { return categoryNames; } public ArrayList<ArrayList<Dish>> getAllDishItems() { return allDishItems; } }
2. 菜品实体类 Dish
import com.google.gson.annotations.SerializedName; public class Dish { @SerializedName("Subcategory") private String subcategory; @SerializedName("DishName") private String dishName; @SerializedName("DishPrice") private String dishPrice; @SerializedName("Dishquantity") private String dishQuantity; @SerializedName("Dishdescription") private String dishDescription; // 必须添加无参构造 public Dish() {} // Getter方法 public String getSubcategory() { return subcategory; } public String getDishName() { return dishName; } public String getDishPrice() { return dishPrice; } public String getDishQuantity() { return dishQuantity; } public String getDishDescription() { return dishDescription; } }
关键修正点总结
- 去掉了多余的嵌套层,直接用
Dish类对应JSON里的单个菜品对象,和JSON结构完全对齐 - 给两个POJO类都添加了无参构造方法,满足Gson解析的要求
- 移除了JSON里不存在的
image字段(如果后续接口会返回,可以保留,但当前会是null) - 字段命名调整为符合Java规范的小驼峰(不影响解析,关键是
@SerializedName要和JSON的key完全一致)
调整后,Retrofit就能正确解析你的JSON数据,拿到的分类和菜品列表就不会是空内容啦。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

