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

如何为嵌套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类犯了两个关键错误:

  1. 多余嵌套了一层Getmenudata,还加了@SerializedName("Alldishitems")——但JSON里的Alldishitems直接是菜品对象的二维数组,根本没有额外的data字段,导致Retrofit找不到对应数据
  2. 没有给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:15:56