ANDROID JSON从嵌套键中检索多个值

时间:2016-04-15 06:55:59

标签: java android json

首先,我想要检索嵌套在评级名称中的所有费率值,并假设我不知道那里有多少个评级,所以应该有某种循环来检查它们。 json对象如下所示。

{
  "restaurant": [
    {
      "restaurantId": "1",
      "restaurantName": "Restaurant A",
      "area": "Skudai",
      "state": "Johor",
      "rating": [
        {
          "ratingId": "1",
          "rate": "5",
          "comment": null,
          "userId": "15"
        },
        {
          "ratingId": "2",
          "rate": "4",
          "comment": null,
          "userId": "14"
        }
      ]
    },
    {
      "restaurantId": "2",
      "restaurantName": "Restaurant 2",
      "area": "Skudai",
      "state": "Johor",
      "rating": null
    }
  ],
  "success": 1
}

下面是在while循环中的retrieveng部分看起来不太正确的代码。对于getAverage中的JSONObject参数,我已经选择了第一家餐厅,即餐厅A,餐厅2不包括在内。

public int getAverage(JSONObject jsonObject){
    int average = 0, count = 0;

    while (jsonObject.has("rate")){
        average += Integer.parseInt(jsonObject.optString("rate"));
        count++;
    }

    average /= count;

    return  average;
}

如何使用optString()从嵌套评级中检索rate的倍数值来计算平均值,还是应该使用其他方式来检索它?

3 个答案:

答案 0 :(得分:3)

您可以将此代码用于参考:

                ArrayList<DrawerCategory> list = new ArrayList<DrawerCategory>();
                ArrayList<DrawerSubCategory> ch_list;
                JSONArray jArray = root.getJSONArray("restaurant");
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject jObject = jArray.getJSONObject(i);
                    DrawerCategory gru = new DrawerCategory();
                  gru.setrestaurantId(jObject.getString("restaurantId"));
                  .
                  .
                  if (jObject.getString("rating").trim().equalsIgnoreCase("null")) {
                        ch_list = new ArrayList<DrawerSubCategory>();
                        DrawerSubCategory ch = new DrawerSubCategory();
                        ch.setName(jObject.getString("rating"));
                        ch_list.add(ch);
                        gru.setItems(ch_list);
                    } else {
                  JSONArray jArray1 = jObject.getJSONArray("rating");
                        ch_list = new ArrayList<DrawerSubCategory>();
                        for (int j = 0; j < jArray1.length(); j++) {
                            JSONObject jObject1 = jArray1.getJSONObject(j);
                            DrawerSubCategory ch = new DrawerSubCategory();
                            ch.setratingId(jObject1.getString("ratingId"));
                             .
                             .
                            ch_list.add(ch);
                            gru.setItems(ch_list);
                        }
                    }
                    list.add(gru);
                }

这里,DrawerCategory,DrawerSubCategory是包含getter和setter方法的item类。

答案 1 :(得分:2)

如果您不想使用库,则可以解析json字符串以获得所有&#34;评级&#34;对于每家餐馆。

示例:

   try{
       JSONObject o = new JSONObject(json);
       JSONArray restaurants = o.getJSONArray("restaurant");
       for(int i = 0; i < restaurants.length(); i++){
           JSONObject restaurant = restaurants.getJSONObject(i);
           JSONArray ratings = restaurant.getJSONArray("rating");
           for(int j = 0; j < ratings.length(); j++){
               JSONObject rating = ratings.getJSONObject(j);
               String ratingId = rating.getString("ratingId");
               Log.d("TestJson ratingId", ratingId);
               String rate = rating.optString("rate");
               Log.d("TestJson rate", rate);
           }
       }
   }catch(Exception e){
        e.printStackTrace();
   }

答案 2 :(得分:0)

Google已经制作了图书馆。

您不需要编写循环和所有。更好的是你应该使用 Java类(模型/ POJO)序列化/反序列化库gson  它会自动将您的类转换为 JSON / JSONArray

请不要练习编写长for个循环。我有很多时候只使用 gson 来解析带有数组的类。

如果您使用的是android studio GSON with studio

,请提供帮助