2011-07-01 15 views
4

私はjsonの解析に初心者です。要求からjsonの文字列を取得しましたが、今はjavaと解析する必要があります。私はjson-libを使っています。しかし、私はそれに精通していないので、私は本当に立ち往生しています。私はそのためのJavaコード以下の使用次のデータjsonとjavaを解析する

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

を抽出する必要があるが、それは私が必要とする結果を与えていない、誰かが...

おかげで多くのことを助けてください!

Javaコード(Sは私が手JSON文字列である)私は、任意のJSONオブジェクトがMap<String, Object>として表すことができ

[ 
{ 
    "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 
     }   
    ]   
}   
    ] 
+2

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

ここでは、リンクのですか?エラーが発生していますか?または、必要なデータを取得していないか? – aldrin

+0

@adrin:スレッド「main」の例外が発生するjava.lang.ClassCastException:net.sf.json.JSONArrayをnet.sf.json.JSONObjectにキャストすることはできません –

答えて

6

を解析する必要が

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。以下のように使用することができます

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

またはslowerが、Googleブランド、GSON、:

は、このような地図にJSONをデシリアライズすることができます(春に同梱)jacksonのようなライブラリを使用します。

Map<String, Object> obj = new Gson().fromJson(json, HashMap.class); 
+1

提案に感謝しますが、私は状況にありますどこでjson-libを使う必要がありますか? –

+1

Gee - 2 downvotes?正直なところ、gsonはjsonとvisa versaからJavaオブジェクトを簡単に構築できます。とにかく... – Bohemian

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参照のためのリンクを提供する方が良いでしょう。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

5

に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

お返事ありがとうございました。:) –

0

私は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 
0

json-libをダウンロードして、JSONObject

{"name": "joe", "age": 33}

ドゥリーを言うことができますを使用しますこの

0

私はこの種のことを容易にするJsonQueryというgithubプロジェクトプロジェクトを開始しました。

プロジェクトはGSONの上に構築されています。あなたがあなたのホテルの名前を取得したい場合は、例えば、それはこのような単純なものでした

:働いていない何

https://github.com/rdbeach/JsonQuery