【问题标题】:Converting a JsonObject to a list of strings将 JsonObject 转换为字符串列表
【发布时间】:2018-05-23 23:21:06
【问题描述】:

所以我试图通过 StringBuffer 解析并将其放入字符串列表中,然后使用 listview 列出所有餐厅名称,但是我在将 StringBuffer 转换为 JsonObject 时遇到问题,因为每次我尝试 getAsJsonObject();功能我的应用程序崩溃任何人都可以帮助弄清楚为什么我不能将 StringBuffer 转换为 JsonObject 以及如何正确获取缓冲区以转换为 JSON 对象。 任何帮助表示赞赏。

String restaurantName;
    JsonElement restaurantJSONElement;
    JsonPrimitive restaurantJSONPrimitive;


    JsonParser parser = new JsonParser();
    // buffer is the StringBuffer read
    JsonElement parentJSONElement = parser.parse(String.valueOf(buffer));
    JsonObject parentJSONObject = parentJSONElement.getAsJsonObject();  
//this is where is crashes I assume its because it cant convert the JsonElement to a JsonObject
    JsonArray restaurantsJSONArray = (JsonArray) parentJSONObject.get("restaurants");
    List<String> restaurantnamelist1 = new ArrayList<String>();

    {
        for (int i = 0; i < 1; i++) {
            //get the element
            restaurantJSONElement = ((JsonObject) restaurantsJSONArray.get(i)).get("restaurant");
            //get the restaurant name
            restaurantJSONPrimitive = ((JsonObject) restaurantJSONElement.getAsJsonObject()).getAsJsonPrimitive("name");
            restaurantName = restaurantJSONPrimitive.getAsString();
            restaurantnamelist1.add(restaurantName);
        }
    }

这就是 StringBuffer 包含的内容:

{
  "results_found": 10573,
  "results_start": 0,
  "results_shown": 20,
  "restaurants": [
    {
      "restaurant": {
        "R": {
          "res_id": 16795271
        },
        "apikey": "fa221c30c201daf8380ac435cedfebe9",
        "id": "16795271",
        "name": "Craigie On Main", //This is what I want to sort it by
        "url": "https://www.zomato.com/boston/craigie-on-main-cambridge?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "location": {
          "address": "853 Main St, Cambridge 02139",
          "locality": "Central Square",
          "city": "Boston",
          "city_id": 289,
          "latitude": "42.3634820000",
          "longitude": "-71.0985660000",
          "zipcode": "02139",
          "country_id": 216,
          "locality_verbose": "Central Square, Boston"
        },
        "switch_to_order_menu": 0,
        "cuisines": "European, French",
        "average_cost_for_two": 275,
        "price_range": 4,
        "currency": "$",
        "offers": [],
        "thumb": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
        "user_rating": {
          "aggregate_rating": "4.2",
          "rating_text": "Very Good",
          "rating_color": "5BA829",
          "votes": "342"
        },
        "photos_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
        "menu_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
        "featured_image": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg",
        "has_online_delivery": 0,
        "is_delivering_now": 0,
        "deeplink": "zomato://restaurant/16795271",
        "has_table_booking": 0,
        "events_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "establishment_types": []
      }
    },
    {
      "restaurant": {
        "R": {
          "res_id": 16798941
        },
        "apikey": "fa221c30c201daf8380ac435cedfebe9",
        "id": "16798941",
        "name": "O Ya",
        "url": "https://www.zomato.com/boston/o-ya-boston?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "location": {
          "address": "9 East St, Boston 02111",
          "locality": "Leather District",
          "city": "Boston",
          "city_id": 289,
          "latitude": "42.3513170000",
          "longitude": "-71.0570370000",
          "zipcode": "02111",
          "country_id": 216,
          "locality_verbose": "Leather District, Boston"
        },
        "switch_to_order_menu": 0,
        "cuisines": "Japanese, Sushi",
        "average_cost_for_two": 275,
        "price_range": 4,
        "currency": "$",
        "offers": [],
        "thumb": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
        "user_rating": {
          "aggregate_rating": "4.3",
          "rating_text": "Very Good",
          "rating_color": "5BA829",
          "votes": "192"
        },
        "photos_url": "https://www.zomato.com/boston/o-ya-boston/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
        "menu_url": "https://www.zomato.com/boston/o-ya-boston/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
        "featured_image": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?output-format=webp",
        "has_online_delivery": 0,
        "is_delivering_now": 0,
        "deeplink": "zomato://restaurant/16798941",
        "has_table_booking": 0,
        "events_url": "https://www.zomato.com/boston/o-ya-boston/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "establishment_types": []
      }
    },
    {
      "restaurant": {
        "R": {
          "res_id": 16798079
        },
        "apikey": "fa221c30c201daf8380ac435cedfebe9",
        "id": "16798079",
        "name": "Solea Restaurant and Tapas Bar",
        "url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "location": {
          "address": "388 Moody St, Waltham 02453",
          "locality": "Waltham",
          "city": "Boston",
          "city_id": 289,
          "latitude": "42.3695490000",
          "longitude": "-71.2370130000",
          "zipcode": "02453",
          "country_id": 216,
          "locality_verbose": "Waltham, Boston"
        },
        "switch_to_order_menu": 0,
        "cuisines": "Spanish, Tapas",
        "average_cost_for_two": 275,
        "price_range": 4,
        "currency": "$",
        "offers": [],
        "thumb": "",
        "user_rating": {
          "aggregate_rating": "4.2",
          "rating_text": "Very Good",
          "rating_color": "5BA829",
          "votes": "303"
        },
        "photos_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
        "menu_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/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/16798079",
        "has_table_booking": 0,
        "events_url": "https://www.zomato.com/boston/solea-restaurant-and-tapas-bar-waltham/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "establishment_types": []
      }
    },
"restaurant": {
        "R": {
          "res_id": 16796139
        },
        "apikey": "fa221c30c201daf8380ac435cedfebe9",
        "id": "16796139",
        "name": "Harvest",
        "url": "https://www.zomato.com/boston/harvest-cambridge?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "location": {
          "address": "44 Brattle St, Cambridge 02138",
          "locality": "Harvard Square",
          "city": "Boston",
          "city_id": 289,
          "latitude": "42.3742680000",
          "longitude": "-71.1219960000",
          "zipcode": "02138",
          "country_id": 216,
          "locality_verbose": "Harvard Square, Boston"
        },
        "switch_to_order_menu": 0,
        "cuisines": "American, Breakfast",
        "average_cost_for_two": 275,
        "price_range": 4,
        "currency": "$",
        "offers": [],
        "thumb": "https://b.zmtcdn.com/data/res_imagery/16796139_RESTAURANT_4f9960714d6bd153a4571dd062c4ff45.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
        "user_rating": {
          "aggregate_rating": "3.9",
          "rating_text": "Good",
          "rating_color": "9ACD32",
          "votes": "190"
        },
        "photos_url": "https://www.zomato.com/boston/harvest-cambridge/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
        "menu_url": "https://www.zomato.com/boston/harvest-cambridge/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
        "featured_image": "https://b.zmtcdn.com/data/res_imagery/16796139_RESTAURANT_4f9960714d6bd153a4571dd062c4ff45.jpg",
        "has_online_delivery": 0,
        "is_delivering_now": 0,
        "deeplink": "zomato://restaurant/16796139",
        "has_table_booking": 0,
        "events_url": "https://www.zomato.com/boston/harvest-cambridge/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
        "establishment_types": []
      }
    },

【问题讨论】:

  • 我刚刚尝试了您的代码,但它并没有崩溃。 JsonArray 餐厅JSONArray 已成功填充。我确实更改了您的 StringBuffer,因为它不是有效的 json 字符串。在任何网站上检查 json 字符串的有效性,例如 json.parser.online.fr
  • 我得到的错误是:尝试在空对象引用上调用虚拟方法
  • 这个错误发生在 JsonElements 尝试做 restaurantJSONElement = ((JsonObject) restaurantJSONArray.get(i)).get("restaurant");不知道为什么我会得到这个,因为我从来没有将任何东西设置为 null
  • 你把 StringBuffer 改成什么了?
  • 每次我尝试放入一个示例 StringBuffer 时,它都会崩溃我不确定你做了什么让它工作,你能告诉我你使用了什么 StringBuffer 吗?

标签: android json parsing stringbuffer


【解决方案1】:

如果您在restaurantJSONArray 上获得NPE,我想您没有正确地将JsonObj 转换为JsonArray,因为看起来部分元素到对象看起来不错,请尝试这样做

 JsonArray restaurantsJSONArray = parentJSONObject.getAsJsonArray("restaurants");

【讨论】:

    【解决方案2】:

    我使用了下面的字符串缓冲区,它工作正常:

    {
      "results_found": 10573,
      "results_start": 0,
      "results_shown": 20,
      "restaurants": [
        {
          "restaurant": {
            "R": {
              "res_id": 16795271
            },
            "apikey": "fa221c30c201daf8380ac435cedfebe9",
            "id": "16795271",
            "name": "Craigie On Main",
            "url": "https://www.zomato.com/boston/craigie-on-main-cambridge?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
            "location": {
              "address": "853 Main St, Cambridge 02139",
              "locality": "Central Square",
              "city": "Boston",
              "city_id": 289,
              "latitude": "42.3634820000",
              "longitude": "-71.0985660000",
              "zipcode": "02139",
              "country_id": 216,
              "locality_verbose": "Central Square, Boston"
            },
            "switch_to_order_menu": 0,
            "cuisines": "European, French",
            "average_cost_for_two": 275,
            "price_range": 4,
            "currency": "$",
            "offers": [],
            "thumb": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
            "user_rating": {
              "aggregate_rating": "4.2",
              "rating_text": "Very Good",
              "rating_color": "5BA829",
              "votes": "342"
            },
            "photos_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
            "menu_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
            "featured_image": "https://b.zmtcdn.com/data/res_imagery/16795271_CHAIN_bd36a0893cde3f70ab4a67f1e086d5f5.jpg",
            "has_online_delivery": 0,
            "is_delivering_now": 0,
            "deeplink": "zomato://restaurant/16795271",
            "has_table_booking": 0,
            "events_url": "https://www.zomato.com/boston/craigie-on-main-cambridge/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
            "establishment_types": []
          }
        },
        {
          "restaurant": {
            "R": {
              "res_id": 16798941
            },
            "apikey": "fa221c30c201daf8380ac435cedfebe9",
            "id": "16798941",
            "name": "O Ya",
            "url": "https://www.zomato.com/boston/o-ya-boston?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
            "location": {
              "address": "9 East St, Boston 02111",
              "locality": "Leather District",
              "city": "Boston",
              "city_id": 289,
              "latitude": "42.3513170000",
              "longitude": "-71.0570370000",
              "zipcode": "02111",
              "country_id": 216,
              "locality_verbose": "Leather District, Boston"
            },
            "switch_to_order_menu": 0,
            "cuisines": "Japanese, Sushi",
            "average_cost_for_two": 275,
            "price_range": 4,
            "currency": "$",
            "offers": [],
            "thumb": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
            "user_rating": {
              "aggregate_rating": "4.3",
              "rating_text": "Very Good",
              "rating_color": "5BA829",
              "votes": "192"
            },
            "photos_url": "https://www.zomato.com/boston/o-ya-boston/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
            "menu_url": "https://www.zomato.com/boston/o-ya-boston/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
            "featured_image": "https://b.zmtcdn.com/data/res_imagery/16798941_CHAIN_d58be7a0f56ad4fbad498ba65b746a67.jpg?output-format=webp",
            "has_online_delivery": 0,
            "is_delivering_now": 0,
            "deeplink": "zomato://restaurant/16798941",
            "has_table_booking": 0,
            "events_url": "https://www.zomato.com/boston/o-ya-boston/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
            "establishment_types": []
          }
        }]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多