Analyse d'un tableau d'objets JSON à l'aide de Jackson 2.0

Je suis en train de mettre à jour Jackson de 1.9.4 à 2.2.0. La transition a été lisse, sauf que je ne parviens pas à obtenir l'analyse de tableau pour les Objets en cours de fonctionnement. En 1.9.4, je pourrais le faire:

private List<Subjects> mSubjects; mSubjects = objectMapper.readValue(subjectsJsonArrayNode, new TypeReference<List<Subjects>>() {}); 

Avec Jackson 2.2.0, j'ai une erreur de temps de compilation "ne peut pas résoudre la méthode". Le fichier d'en-tête ObjectMapper de Jackson pour 1.9.4 contient ces méthodes readValue pour JsonNodes:

 public <T> T readValue(JsonNode root, java.lang.Class<T> valueType) public <T> T readValue(JsonNode root, org.codehaus.jackson.type.TypeReference valueTypeRef) public <T> T readValue(JsonNode root, org.codehaus.jackson.type.JavaType valueType) 

Et le fichier d'en-tête de Jackson 2.2.0:

 public <T> T readValue(JsonParser jsonParser, java.lang.Class<T> tClass) public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.TypeReference<?> typeReference) public final <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.core.type.ResolvedType resolvedType) public <T> T readValue(JsonParser jsonParser, com.fasterxml.jackson.databind.JavaType javaType) 

J'ai donc besoin de passer d'un JsonNode à un JsonParser, mais je ne sais pas très bien comment faire cette transition. Cela dit, je ne sais pas si je dépasse même le bon chemin parce que JsonParser est défini comme une classe abstraite, de sorte que je ne peux même pas facilement initialiser une instance pour la jouer.

Pour ceux qui viennent sans réponse, voici une solution temporaire que j'ai mise en place où je itère et analyse manuellement chaque objet:

  private List<Subjects> mSubjects = new ArrayList<Subjects>(); for(JsonNode subjectJsonNode : subjectsJsonArrayNode) { mSubjects.add(objectMapper.treeToValue(subjectJsonNode, Subject.class)); } 

2 Solutions collect form web for “Analyse d'un tableau d'objets JSON à l'aide de Jackson 2.0”

Vous pouvez simplement appeler la méthode JsonNode.traverse() pour obtenir le JsonParser .

Testé avec l'exemple simple suivant:

 public class App { public static class Foo { public int foo; } public static void main(String[] args) { String json = "{\"someArray\":[{\"foo\":5},{\"foo\":6},{\"foo\":7}]}"; ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(json); node = node.get("someArray"); TypeReference<List<Foo>> typeRef = new TypeReference<List<Foo>>(){}; List<Foo> list = mapper.readValue(node.traverse(), typeRef); for (Foo f : list) { System.out.println(f.foo); }   } } 

les sorties:

5
6
7

J'utilise cette méthode pour les listes:

 /** * Returns a list collection of any specified type * @param jsonValue the json string content to deserialize * @param type the type to serialize into * @return a list of specified type */ public List<?> readJSONToList(String jsonValue,Class<?> type){ List<?> objDTOS=null; try { //get json content without root name JsonNode root= objectMapper.readTree(jsonValue).get(getRootName()); TypeFactory tf = objectMapper.getTypeFactory(); JavaType listOfObjs = tf.constructCollectionType(ArrayList.class,type); objDTOS=objectMapper.readValue(root.traverse(), listOfObjs); } catch (NullPointerException e) { Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR); } catch (JsonParseException e) { Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR); } catch (IOException e) { Logger.write("Jackson Json List Reader", e.getMessage(), Logger.ERROR); } return objDTOS; } 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.