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 ?