Разбор JSON с Java - PullRequest
       20

Разбор JSON с Java

4 голосов
/ 01 июля 2011

Я новичок в разборе json, я получил строку json из запроса, и теперь мне нужно проанализировать ее с помощью java. Я использую для этого json-lib. Но я действительно застрял, потому что я не знаком с этим. Мне нужно извлечь следующие данные

1. name (hotel name)
2. starRating
3. geoPoint

Я использовал следующий код Java для этого, но он не дает мне нужного результата, пожалуйста, кто-нибудь поможет мне ...

Большое спасибо!

Java-код (s - это строка json, которую я получаю)

JSONObject json = (JSONObject) JSONSerializer.toJSON(s);    
JSONArray jarray = json.getJSONArray("hotels");
for(int i=0 ; i < jarray.size(); i++) {
System.out.println("jarray [" + i + "] --------" + jarray.getString(i));
}

json мне нужно разобрать

[
{
    "total": 250,
    "offset": 0,
    "requestID": "-btygi09oxfov",
    "locationName": "Paris, France",
    "locationLatitude": 48.86,
    "locationLongitude": 2.34,
    "cityCode": "PARIS_J_FR",
    "hotels": [
        {
            "ypid": "YN10001x300073304",
            "id": 56263,
            "hotelRateIndicator": "2",
            "name": "Renaissance Paris Vendome Hotel",
            "brandCode": "69",
            "addressLine1": "4 Rue du Mont-Thabor",
            "city": "Paris",
            "neighborhood": "",
            "state": "IdF",
            "country": "US",
            "cachedPrice": 935,
            "geoPoint": [
                48.865361,
                2.329584
            ],
            "starRating": "5",
            "thumbnailUrl": "http://www.orbitz.com//public/hotelthumbnails/53/97/85397/85397_TBNL_1246535840051.jpg",
            "total": 250,
            "amenities": [
                "24",
                "31",
                "42",
                "52",
                "9"
            ],
            "telephoneNumbers": [
                ""
            ],
            "popularity": 837
        },
        {
            "ypid": "YN10001x300073331",
            "id": 112341,
            "hotelRateIndicator": "3",
            "name": "Renaissance Paris Arc de Triomphe Hotel",
            "brandCode": "69",
            "addressLine1": "39 Avenue de Wagram",
            "city": "Paris",
            "neighborhood": "",
            "state": "IdF",
            "country": "US",
            "cachedPrice": 633,
            "geoPoint": [
                48.877107,
                2.297451
            ],
            "starRating": "5",
            "thumbnailUrl": "http://www.orbitz.com//public/hotelthumbnails/21/72/302172/302172_TBNL_1246535872514.jpg",
            "total": 250,
            "amenities": [
                "24",
                "31",
                "42",
                "9"
            ],
            "telephoneNumbers": [
                ""
            ],
            "popularity": 796
        }           
  ]         
}           
  ]

Ответы [ 5 ]

6 голосов
/ 01 июля 2011

Любой объект JSON может быть представлен как Map<String, Object>.

. Использовать библиотеку, такую ​​как Джексон (поставляется с пружиной), которая может десериализовать JSON на карту, подобную этой:*

Map<String, Object> obj = new ObjectMapper().readValue(json, new TypeReference<Map<String, Object>>());

Или медленнее , но под маркой Google, GSON , который можно использовать как.

Map<String, Object> obj = new Gson().fromJson(json, HashMap.class);
5 голосов
/ 01 июля 2011

Чтобы обойти исключение ClassCastException, вам просто нужно внести изменения, которые он предлагает вам: обрабатывать ввод как массив, а не как объект.

JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(s);
JSONObject json = (JSONObject) outerArray.get(0);
JSONArray jarray = json.getJSONArray("hotels");
for (int i = 0; i < jarray.size(); i++)
{
  System.out.println("jarray [" + i + "] --------" + jarray.getString(i));
}

И вот пример получения названия каждого отеля.

JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(s);
JSONObject json = (JSONObject) outerArray.get(0);
JSONArray jarray = json.getJSONArray("hotels");
for (int i = 0; i < jarray.size(); i++)
{
  JSONObject hotel = jarray.getJSONObject(i);
  String name = hotel.getString("name");
  System.out.println(name);
}
0 голосов
/ 23 ноября 2014

Я запустил проект Github под названием JsonQuery, который делает подобные вещи проще.

Проект построен на базе GSON.

Если вы хотите получить название вашего отеля, например, это может быть так просто:

JsonQuery $ = JsonQuery.fromJson(s); 
$.val("hotels.name");

Вот ссылка:

https://github.com/rdbeach/JsonQuery

0 голосов
/ 04 апреля 2014

Загрузите json-lib и используйте JSONObject

Скажем, {"name": "joe", "age": 33}

Делай как это

JSONObject jobject=new JSONObject(jsonstring);
String name=jobject.getString("name");
0 голосов
/ 12 марта 2013

Я рекомендую парсер Djson (библиотека Java).https://github.com/jungkoo/djson_parser

код:

Var hotels = Djson.parse(new File("d:\\sample1.txt")).find("[0].hotels");

for(int i=0; i<hotels.size(); i++) {            
  System.out.println(hotels.get(i).get("name").toString());
  System.out.println(hotels.get(i).get("starRating").toInt());
  System.out.println(hotels.get(i).find("geoPoint").get(0).toDouble()); // case1) basic
  System.out.println(hotels.get(i).find("geoPoint[1]").toDouble()); // case2) find()    
  System.out.println();
}

выход:

Renaissance Paris Vendome Hotel 5
48.865361
2.329584

Renaissance Paris Arc de Triomphe Hotel 5
48.877107
2.297451
...