用java解析json

我是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 } ] } ] 

任何JSON对象都可以表示为Map

使用像jackson (随spring一起提供)的库,它可以将json反序列化为Map,如下所示:

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

或者速度较慢但谷歌品牌的GSON可以像。

 Map obj = new Gson().fromJson(json, HashMap.class); 

要超越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); } 

我推荐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 

输出:

 Renaissance Paris Vendome Hotel 5 48.865361 2.329584 Renaissance Paris Arc de Triomphe Hotel 5 48.877107 2.297451 

下载json-lib并使用JSONObject

让我们说{"name": "joe", "age": 33}

这样做

 JSONObject jobject=new JSONObject(jsonstring); String name=jobject.getString("name"); 

我已经启动了一个名为JsonQuery的github项目项目,这使得这种事情更容易。

该项目建立在GSON之上。

例如,如果您想要检索酒店的名称,可能就像这样简单:

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

链接在这里:

https://github.com/rdbeach/JsonQuery