2017-08-18 9 views
0

レストランの詳細を表示するアンドロイドアプリを作成しようとしています。私は引数として文字列jsonを取るparseJSON関数を持っています。今私がしようとしていることは、下のjsonにある個々のレストランの名前を示すことです。私は個々のレストラン(3レベルの深さ)を抽出してlog.dコンソールから出力することができますが、個々のレストランの名前を抽出することはできません。コードはこちら4レベルのネストしたJSON配列で名前を抽出できません

public void parseJSON(String jsonQuery){ 
     //Parsing JSON 
     try { 
      JSONObject jsonObject = new JSONObject(jsonQuery); 
      if (jsonObject != null){ 
       JSONArray restaurants = jsonObject.getJSONArray("restaurants"); 
       for (int i = 0; i < restaurants.length(); i++){ 
        JSONObject restaurant = restaurants.getJSONObject(i); 
        if (restaurant != null){ 
         String tempName = restaurant.getString("name"); 
         Log.d(TAG, "Restaurant name: " + tempName); 
        } 
       } 
      } 

     } catch (JSONException e) { 
      Log.d(TAG, "Exception catched: " + e); 
      e.printStackTrace(); 
     } 
    } 

ここは私のjsonファイルです。私は取得しています

{ 
    "results_found": 1281966, 
    "results_start": 0, 
    "results_shown": 2, 
    "restaurants": [ 
    { 
     "restaurant": { 
     "R": { 
      "res_id": 16607974 
     }, 
     "apikey": "123456789", 
     "id": "16607974", 
     "name": "Bassine Specialty Cheese", 
     "url": "https://www.zomato.com/bass-vic/bassine-specialty-cheese-bass?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "2125 Bass Hwy", 
      "locality": "Bass", 
      "city": "Bass", 
      "city_id": 1341, 
      "latitude": "-38.4833750000", 
      "longitude": "145.4670320000", 
      "zipcode": "3995", 
      "country_id": 14, 
      "locality_verbose": "Bass, Bass" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "Ice Cream", 
     "average_cost_for_two": 7, 
     "price_range": 1, 
     "currency": "$", 
     "offers": [], 
     "thumb": "", 
     "user_rating": { 
      "aggregate_rating": "2.9", 
      "rating_text": "Average", 
      "rating_color": "FFBA00", 
      "votes": "5" 
     }, 
     "photos_url": "https://www.zomato.com/bass-vic/bassine-specialty-cheese-bass/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/bass-vic/bassine-specialty-cheese-bass/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/16607974", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/bass-vic/bassine-specialty-cheese-bass/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    }, 
    { 
     "restaurant": { 
     "R": { 
      "res_id": 17649424 
     }, 
     "apikey": "3d93604b4a84d85f374f39ea3b644132", 
     "id": "17649424", 
     "name": "Schobels' Restaurant", 
     "url": "https://www.zomato.com/columbus-tx/schobels-restaurant-columbus?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "location": { 
      "address": "2020 Milam St 78934", 
      "locality": "Columbus", 
      "city": "Columbus", 
      "city_id": 9241, 
      "latitude": "29.6965000000", 
      "longitude": "-96.5405000000", 
      "zipcode": "78934", 
      "country_id": 216, 
      "locality_verbose": "Columbus, Columbus" 
     }, 
     "switch_to_order_menu": 0, 
     "cuisines": "German, Southern", 
     "average_cost_for_two": 25, 
     "price_range": 2, 
     "currency": "$", 
     "offers": [], 
     "thumb": "", 
     "user_rating": { 
      "aggregate_rating": "4.0", 
      "rating_text": "Very Good", 
      "rating_color": "5BA829", 
      "votes": "164" 
     }, 
     "photos_url": "https://www.zomato.com/columbus-tx/schobels-restaurant-columbus/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop", 
     "menu_url": "https://www.zomato.com/columbus-tx/schobels-restaurant-columbus/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop", 
     "featured_image": "", 
     "has_online_delivery": 0, 
     "is_delivering_now": 0, 
     "deeplink": "zomato://restaurant/17649424", 
     "has_table_booking": 0, 
     "events_url": "https://www.zomato.com/columbus-tx/schobels-restaurant-columbus/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1", 
     "establishment_types": [] 
     } 
    } 
    ] 
} 

エラー: org.json.JSONException:名前なし値

+0

私の下の答えを確認してください – akhilesh0707

答えて

1

あなたjsonQueryrestaurantという名前JsonObjectJsonObjectが含まれているので、あなたがJSONObject restaurantsJSONObject =restaurant.getJSONObject("restaurant");同様JSONObject restaurant = restaurants.getJSONObject(i);

からJsonObjectを取得する必要があります

オブジェクトから名前を取得する例を以下に試してください

try { 
    JSONObject jsonObject = new JSONObject(jsonQuery); 
    if (jsonObject != null){ 
     JSONArray restaurants = jsonObject.getJSONArray("restaurants"); 
     for (int i = 0; i < restaurants.length(); i++){ 
      JSONObject restaurant = restaurants.getJSONObject(i); 
      JSONObject restaurantsJSONObject =restaurant.getJSONObject("restaurant"); 
      if(restaurantsJSONObject.has("name")) { 
       String tempName = restaurantsJSONObject.getString("name"); 
       Log.d(TAG, "Restaurant name: " + tempName); 
      } 
     } 
    } 
} catch (JSONException e) { 
    Log.d(TAG, "Exception catched: " + e); 
    e.printStackTrace(); 
} 
+0

ありがとうございました!私はまだこれらのオブジェクトの注文について混乱しています!あなたはもう少し詳しく話すことができますか? –

+0

@ killerprince182 goto http://jsonviewer.stack.hu/コピーしてjson – akhilesh0707

+0

をコピーし、応答の構造を確認してください。json – akhilesh0707

関連する問題