繁体   English   中英

如何解析 Retrofit 中的 JSON 嵌套数组?

[英]How to parse JSON nested array in Retrofit?

我想在 Retrofit 的帮助下解析 JSON 数据。 然而,在我给出的 JSON 结构中,对象中有一个 object 和一个数组。 我找不到任何类似的示例结构。 这就是为什么我想问这样一个问题。 希望对大家有用

如何解析/获取所有数据

{
"MyData": [
  {
    "food_id": "1",
    "food_name": "Food 1",
    "food_image": "imageurl",
    "food_kcal": "32",
    "food_url": "url",
    "food_description": "desc",
    "carb_percent": "72",
    "protein_percent": "23",
    "fat_percent": "4",
    "units": [
      {
        "unit": "Unit A",
        "amount": "735.00",
        "calory": "75.757",
        "calcium": "8.580",
        "carbohydrt": "63.363",
        "cholestrl": "63.0",
        "fiber_td": "56.12",
        "iron": "13.0474",
        "lipid_tot": "13.01",
        "potassium": "11.852",
        "protein": "717.1925",
        "sodium": "112.02",
        "vit_a_iu": "110.7692",
        "vit_c": "110.744"
      },
      {
        "unit": "Unit C",
        "amount": "32.00",
        "calory": "23.757",
        "calcium": "53.580",
        "carbohydrt": "39.363",
        "cholestrl": "39.0",
        "fiber_td": "93.12",
        "iron": "93.0474",
        "lipid_tot": "93.01",
        "potassium": "9.852",
        "protein": "72.1925",
        "sodium": "10.0882",
        "vit_a_iu": "80.7692",
        "vit_c": "80.744"
      }
    ]
  },
  {
    "food_id": "2",
    "food_name": "Food 2",
    "food_image": "imageurl",
    "food_kcal": "50",
    "food_url": "url",
    "food_description": "desc",
    "carb_percent": "25",
    "protein_percent": "14",
    "fat_percent": "8",
    "units": [
      {
        "unit": "Unit A",
        "amount": "25.00",
        "calory": "25.757",
        "calcium": "55.580",
        "carbohydrt": "53.363",
        "cholestrl": "53.0",
        "fiber_td": "53.12",
        "iron": "53.0474",
        "lipid_tot": "53.01",
        "potassium": "17.852",
        "protein": "757.1925",
        "sodium": "122.02",
        "vit_a_iu": "10.7692",
        "vit_c": "10.744"
      },
      {
        "unit": "Unit C",
        "amount": "2.00",
        "calory": "2.757",
        "calcium": "5.580",
        "carbohydrt": "3.363",
        "cholestrl": "3.0",
        "fiber_td": "3.12",
        "iron": "3.0474",
        "lipid_tot": "3.01",
        "potassium": "77.852",
        "protein": "77.1925",
        "sodium": "12.02",
        "vit_a_iu": "0.7692",
        "vit_c": "0.744"
      },
      {
        "unit": "Unit G",
        "amount": "1.00",
        "calory": "2.1",
        "calcium": "0.580",
        "carbohydrt": "0.363",
        "cholestrl": "0.0",
        "fiber_td": "0.12",
        "iron": "0.0474",
        "lipid_tot": "0.01",
        "potassium": "5.852",
        "protein": "0.1925",
        "sodium": "1.02",
        "vit_a_iu": "0.7692",
        "vit_c": "0.744"
      }
    ]
  }
]
}

我的数据 Class

public class MyData {
   @SerializedName("MyData")
   @Expose
   private List<Foods> myData = null;

   public List<Foods> getMyData() {
       return myData;
   }

   public void setMyData(List<Foods> myData) {
       this.myData = myData;
   }
}

食品 Class


public class Foods {
   @SerializedName("food_id")
   @Expose
   private String foodId;
   @SerializedName("food_name")
   @Expose
   private String foodName;
   @SerializedName("food_image")
   @Expose
   private String foodImage;
   @SerializedName("food_kcal")
   @Expose
   private String foodKcal;
   @SerializedName("food_url")
   @Expose
   private String foodUrl;
   @SerializedName("food_description")
   @Expose
   private String foodDescription;
   @SerializedName("carb_percent")
   @Expose
   private String carbPercent;
   @SerializedName("protein_percent")
   @Expose
   private String proteinPercent;
   @SerializedName("fat_percent")
   @Expose
   private String fatPercent;
   @SerializedName("units")
   @Expose
   private List<FoodUnitsData> units = null;

// getters and setters

}




FoodUnitData class


public class FoodUnitsData {
   @SerializedName("unit")
   @Expose
   private String unit;
   @SerializedName("amount")
   @Expose
   private String amount;
   @SerializedName("calory")
   @Expose
   private String calory;
   @SerializedName("calcium")
   @Expose
   private String calcium;
   @SerializedName("carbohydrt")
   @Expose
   private String carbohydrt;
   @SerializedName("cholestrl")
   @Expose
   private String cholestrl;
   @SerializedName("fiber_td")
   @Expose
   private String fiberTd;
   @SerializedName("iron")
   @Expose
   private String iron;
   @SerializedName("lipid_tot")
   @Expose
   private String lipidTot;
   @SerializedName("potassium")
   @Expose
   private String potassium;
   @SerializedName("protein")
   @Expose
   private String protein;
   @SerializedName("sodium")
   @Expose
   private String sodium;
   @SerializedName("vit_a_iu")
   @Expose
   private String vitAIu;
   @SerializedName("vit_c")
   @Expose
   private String vitC;


// getters and setters

}

食品API接口


public interface FoodAPI {
   String FOOD_DATA_URL = "https://raw.githubusercontent.com/theoyuncu8/data/gh-pages/";
   @Headers("Content-Type: application/json")
   @GET("FoodLIST.json")
   Call<MyData>  getAllData();
}

MainActivity(问题就在这里)

public void getRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(FoodAPI.FOOD_DATA_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        FoodAPI foodAPI = retrofit.create(FoodAPI.class);


        Call<MyData> call = foodAPI.getAllData();

        call.enqueue(new Callback<MyData>() {
            @Override
            public void onResponse(@NonNull Call<MyData> call, @NonNull Response<MyData> response) {

                
                Log.d("TAG_JSON_FOOD_DB", "--------: " + response.message());
                List<Foods> foods=response.body().getMyData();

                /// How do I get the Units (array) values ​​inside a Food object and the value for each object in them?
    

               // I can reach all foodNames here. How can I access with nested loop

                for (int i=0; i<foods.size(); i++){
                    Log.d("TAG_JSON_FOOD_DB", "--------: "+foods.get(i).getFoodName());
                }



                for (int j=0; j<foods.size(); j++){
                    Log.d("TAG_JSON_FOOD_DB", "--------: " +);
                }
            }

            @Override
            public void onFailure(@NonNull Call<MyData> call, @NonNull Throwable t) {

            }
        });
    }

只需使用您的吸气剂,它可能会起作用。

如果你想得到 foodName,在“for”循环中你可以输入:

list.get(i).getFoodName; //getFoodName is your getter in Foods.java class

如果你想访问第一个“单元”:

//getUnits is your getter in Foods class
//getUnit is your getter in FoodUnitData class
list.get(i).getUnits.get(0).getUnit; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM