2013-07-05 22 views
12

'u kullanarak bir JSON nesnesi dizisini ayrıştırma Jackson'ı 1.9.4'den 2.2.0'a yükseltme işlemindeyim. Geçiş sorunsuz oldu, ancak Objects için çalışırken ayrıştırma dizisi göremiyorum. 1.9.4 ben yapabilirsiniz:Jackson 2.0

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

, ben bir "yöntem çözemezse" derleme zamanı hatası alıyorum. 1.9.4 için Jackson'ın ObjectMapper başlık dosyası JsonNodes bu readValue yöntemleri içerir:

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) 

Ve Jackson 2.2.0 en başlık dosyası:

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) 

Bu yüzden bir JsonParser bir JsonNode geçen geçiş gerekir, ama bu geçişi nasıl yapacağımı tam olarak bilmiyordum. Bu, JsonParser'ın soyut bir sınıf olarak tanımlandığından, doğru yola indiğimden emin değilim. Bu yüzden, onunla oynamak için bir örneği kolayca başlatamıyorum.

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

cevap

41

Sadece JsonParser almak için JsonNode.traverse() yöntemini çağırabilirsiniz: bir cevap vermeden gelenlere için

, burada ben yineleme ve elle her nesneyi ayrıştırmak yerine ben geçici bir çözümdür.

aşağıdaki örnekle test edilmiştir:

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

çıkışlar:

+1

traverse() oyunu yaptı. Çok teşekkürler Brian. Şerefe! Foo sınıfının – Mark

+0

çalışmaz. Alternatif olarak, istediğiniz şeyi yapmak için tasarlanmış ObjectMapper.treeToValue() 'çağrısını kullanabilirsiniz. – herau

+0

özel deserializer'ı varsa – StaxMan

1

I listeler için bu yöntemi kullanmak:

/** 
* 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

getRootName() nedir? ve herhangi bir RootName handeliing için jenerik yapmak nasıl ?? –