2013-07-05 24 views
12

Sono in procinto di aggiornare Jackson da 1.9.4 a 2.2.0. La transizione è stata fluida, tranne che non riesco a ottenere l'analisi dell'array per gli oggetti che funzionano. In 1.9.4 avrei potuto fare questo:Analisi di un array di oggetti JSON utilizzando Jackson 2.0

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

con Jackson 2.2.0, ottengo un errore "non può risolvere il metodo" a tempo di compilazione. file di intestazione ObjectMapper di Jackson per 1.9.4 contiene questi metodi readValue per 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) 

E file di intestazione di 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) 

quindi ho bisogno di passare da un passaggio a un JsonNode JsonParser, ma non sono abbastanza sicuro su come effettuare questa transizione. Detto questo, non sono sicuro se sto andando giù nella giusta direzione perché JsonParser è definito come una classe astratta, quindi non posso nemmeno inizializzare facilmente un'istanza per giocarci.

Per chi viene senza una risposta, qui è una soluzione temporanea che ho in luogo in cui mi iterare e analizzo manualmente ogni oggetto:

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

risposta

41

si può semplicemente chiamare il metodo JsonNode.traverse() per ottenere il JsonParser.

testati con il seguente semplice esempio:

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

uscite:

+1

traverso() ha fatto il trucco. Mille grazie, Brian. Saluti! – Mark

+0

non funziona se la classe Foo ha un deserializzatore personalizzato – herau

+0

In alternativa, è possibile utilizzare la chiamata 'ObjectMapper.treeToValue()', progettata per fare ciò che si desidera. – StaxMan

1

uso questo metodo per elenchi:

/** 
* 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; 
} 
+0

cosa è getRootName()? e come renderlo generico per la gestione di qualsiasi RootName ?? –

Problemi correlati