2011-07-01 2 views
4

Je suis un débutant à l'analyse JSON, j'ai saisi une chaîne JSON à partir d'une demande et maintenant je dois l'analyser avec Java. J'utilise json-lib pour ça. Mais je suis vraiment coincé car je ne le connais pas. Je dois extraire les données suivantesparser json avec java

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

j'ai utilisé suivant le code java pour cela, mais ce n'est pas de me donner le résultat que j'ai besoin, s'il vous plaît quelqu'un me aider ...

Merci beaucoup!

code java (s est la chaîne JSON je reçois)

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 Je dois analyser

[ 
{ 
    "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

Qu'est-ce qui ne fonctionne pas? Avez-vous une erreur? Ou ne pas obtenir les données dont vous avez besoin? – aldrin

+0

@adrin: Je reçois une exception Exception dans le fil "main" java.lang.ClassCastException: net.sf.json.JSONArray ne peut pas être converti en net.sf.json.JSONObject –

Répondre

6

Tout objet JSON peut être représenté comme Map<String, Object>.

Utilisez une bibliothèque comme jackson (livré avec ressort), qui peut désérialiser JSON à une carte comme ceci:

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

Ou le slower, mais marque Google, GSON, qui peut être utilisé comme.

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

Merci pour la suggestion mais je suis dans une situation où je dois utiliser json-lib :) –

+1

Gee - 2 downvotes? Honnêtement, gson peut construire des objets java de json et vice versa si facilement. Quoi qu'il en soit ... – Bohemian

+0

Alors que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –

5

Pour passer le ClassCastException, vous avez juste besoin de faire le changement, il vous dit de faire: pour gérer l'entrée comme un tableau et non pas comme un objet.

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)); 
} 

Et, voici un exemple d'obtention de chaque nom d'hôtel.

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

Merci beaucoup pour votre réponse ... :) –

0

Je recommande Djson parser (bibliothèque java). https://github.com/jungkoo/djson_parser

Code

:

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(); 
} 

sortie:

Renaissance Paris Vendome Hotel 5 
48.865361 
2.329584 

Renaissance Paris Arc de Triomphe Hotel 5 
48.877107 
2.297451 
0

Téléchargez le json-lib et utilisation d'JSONObject

permet de dire {"name": "joe", "age": 33}

Do li ke this

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

J'ai démarré un projet de projet github appelé JsonQuery qui facilite ce genre de choses.

Le projet est construit sur GSON.

Si vous vouliez récupérer le nom de votre hôtel, par exemple, il pourrait être aussi simple que cela:

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

Voici le lien:

https://github.com/rdbeach/JsonQuery