L'analyse JSON à l'aide de Java/Jackson
J'ai une petite application de test je suis en train d'écrire en Java pour analyser certains JSON de le Reddit de l'API. Quelques exemples de JSON, je suis à la recherche pour analyser serait comme ceci:
[
{
"kind": "Listing",
"data": {
"modhash": "1jq62oyvwe15aaba7eb18b0b4363b567a00750766351e03dcc",
"children": [
{
"kind": "t3",
"data": {
"domain": "businessinsider.com",
"media_embed": {},
"levenshtein": null,
"subreddit": "Android",
"selftext_html": null,
"selftext": "",
"likes": null,
"saved": false,
"id": "n17u2",
"clicked": false,
"title": "CONFESSION OF A NON-APPLE-FANBOY: Even If The Samsung Galaxy Nexus Is Better, I'm Still Buying An iPhone",
"media": null,
"score": 0,
"over_18": false,
"hidden": false,
"thumbnail": "http://e.thumbs.redditmedia.com/sL0dCwGAvWqnY_sd.jpg",
"subreddit_id": "t5_2qlqh",
"author_flair_css_class": null,
"downs": 2,
"is_self": false,
"permalink": "/r/Android/comments/n17u2/confession_of_a_nonapplefanboy_even_if_the/",
"name": "t3_n17u2",
"created": 1323127132,
"url": "http://www.businessinsider.com/apple-iphone-versus-samsung-galaxy-nexus-2011-12",
"author_flair_text": null,
"author": "FormulaT",
"created_utc": 1323101932,
"num_comments": 0,
"ups": 1
}
}
],
"after": null,
"before": null
}
},
{
"kind": "Listing",
"data": {
"modhash": "1jq62oyvwe15aaba7eb18b0b4363b567a00750766351e03dcc",
"children": [],
"after": null,
"before": null
}
}
]
Ce que je suis en train d'accomplir est d'obtenir quelques valeurs de ce JSON, par exemple, le titre et l'auteur. Je suis l'aide de Jackson pour gérer le JSON, et le code que j'utilise ressemble à ceci:
URLConnection conn = redditURL.openConnection();
BufferedReader buf = new BufferedReader(new InputStreamReader(conn.getInputStream()));
ObjectMapper mapper = new ObjectMapper();
RedditComment comment = mapper.readValue(buf, RedditComment.class);
Iterator itr = comment.getData().getChildren().listIterator();
J'ai créé le RedditComment et autres classes à l'aide de la JSONGen site (http://jsongen.byingtondesign.com/). Cependant, lors de l'analyse du JSON de la BufferedReader, Jackson lance cette exception:
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.test.RedditAPI.RedditComment out of START_ARRAY token
at [Source: java.io.BufferedReader@3ebfbbe3; line: 1, column: 1]
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:869)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1877)
at com.test.RedditAPI.main.returnRedditComment(Main.java:17)
Quelqu'un a une idée? J'ai été de me gratter la tête pendant quelques heures maintenant.
EDIT: Merci à @Menton Boon et @Chris, je suis venu avec la suite (après le passage à GSON):
Gson gson = new Gson();
List<RedditComment> comment = gson.fromJson(buf, new TypeToken<List<RedditComment>>() {}.getType());
List<RedditChildren> children = comment.get(1).getData().getChildren();
System.out.println(children.get(1).getData().getAuthor());
mais qui lève l'exception suivante:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.test.RedditAPI.RedditChildren
Excuses si je suis bon, j'ai regardé autour de l'API et il n'y a pas de référence de LinkedHashMaps, donc je ne sais pas pourquoi il est à apparaître ici.
- Juste une je devine, mais je pense que vous devez supprimer la normale crochets (
[
et]
) autour de l'accolades dans votre entrée. Ou! Vous avez à dire à Jackson pour traiter votre entrée comme un tableau JSON au lieu d'un objet JSON. JSON (tableaux, autant que je sache, sont entre parenthèses, tandis que les objets sont dans des accolades. Voir le la documentation.) - double possible de stackoverflow.com/q/4392326/922954 ?
Vous devez vous connecter pour publier un commentaire.
si vous ne l'avez pas déjà investi trop de temps dans la Jackson, je vous recommande de regarder GSON, voici un tutoriel qui devrait avoir commencé.
Google GSON API maps votre chaîne JSON en un objet de domaine.
http://java.sg/parsing-a-json-string-into-an-object-with-gson-easily/
Aussi, vous pouvez utiliser un Parser JSON pour voir votre JSON.
Le problème est que la réponse est un tableau d'entrées. Essayez: