2016-04-15 12 views
-2

まず、レーティング名にネストされたすべてのレート値を取得したいと思います。そこにいくつのレーティングがあるか分からないため、何らかのループそれらをチェックしてください。 jsonオブジェクトを以下に示します。ANDROID 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ループの検索部分で正しくないと思われるコードです。 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に()を使用して、ネストした評価からレートの倍数の値を取得するか、または私はそれを取得するために他の方法を使用する必要がありますか?

+1

あなたのコードはどこですか?何か試しましたか? –

+0

jsonレスポンスをコピーしてhttp://json2csharp.comに貼り付けると、クラスがC#になり、クラスがJavaに変換され、GSONを使用してJSONが解析されます。あなたができないなら、plsはこれをチェックするhttp://stackoverflow.com/questions/36625488/how-to-deserialize-json-with-a-string-url-name-value-pair/36625899#36625899 –

答えて

1

を使用している場合

ヘルプ。

例:

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(); 
    } 
+0

ここでは、 ratingIdとrateの値は1つだけです。私たちはすべてのIDとレートが必要な場合は?? –

+0

レストランに関連付けられたコレクションを作成し、forループ内に各値をコレクションに追加する必要があります。 – Nirekin

+0

クラスのgetterセッターメソッドのようなコレクション\ –

0

Googleは既にライブラリを作成しています。

ループとすべてを書く必要はありません。 Javaクラス(Model/POJO)シリアライゼーション/デシリアライズライブラリgson を使用すると、クラスがJSON/JSONArrayに自動的に変換されます。

そして長いforループを書くのを練習しないでください。 gsonのみを使用して、配列でクラスを解析するのに何度も使用することがあります。あなたは、各レストランのために、すべての「格付け」を取得するには、JSON文字列を解析することができ、ライブラリを使用したくない場合は、あなたは、AndroidスタジオGSON with studio

2

あなたが参照にこのコードを使用することができます:ここで

   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メソッドが含まれているアイテムのクラスがあります。

関連する問題