我正在尝试创建显示有关餐厅详细信息的android应用。我有parseJSON函数,它将字符串json作为参数。我现在想做的是在下面的json中显示各个餐厅的名称。我能够提取单个餐厅(深3级)并通过log.d控制台将其打印出来,但是我无法提取单个餐厅的名称。这是代码

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:名称没有值

最佳答案

您的jsonQuery在名为JsonObjectJsonObject中包含restaurant,因此您需要从JSONObject restaurant = restaurants.getJSONObject(i);获取JsonObject。

JSONObject restaurantsJSONObject =restaurant.getJSONObject("restaurant");

尝试以下示例从对象获取名称

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

07-28 01:27
查看更多