【问题标题】:Unable to extract out name in 4 level deep nested JSON array无法在 4 级深度嵌套 JSON 数组中提取名称
【发布时间】:2017-08-18 12:44:23
【问题描述】:

我正在尝试创建显示有关餐厅详细信息的 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:名称没有值

【问题讨论】:

  • 查看我下面的答案

标签: java android json


【解决方案1】:

您的jsonQueryJsonObject 内包含JsonObject,名为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();
}

【讨论】:

  • 感谢现在正在工作!我仍然对这些对象订单感到困惑!你能多讲讲他们吗?
  • @killerprince182 转到 jsonviewer.stack.hu 并复制粘贴您的 json
  • 然后检查你的响应json的结构
  • 你可以看到餐厅数组里面的餐厅数组你会发现一些对象
  • 点击其中一个 jsonObject 你会看到它包含一个restaurant对象
猜你喜欢
  • 2021-10-20
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
相关资源
最近更新 更多