2011-07-31 24 views
10

Şuna benzeyen bir sınıfım var:

public class Person { 
    public class Address { 
     private String line1; 
     private String line2; 
     private String zipCode; 
     private String state; 

     // standard public getters and setters for the class here 
    } 

private String name; 
private String address; 

// standard public getters and setters for the class here 

} 

ve burada jackson'u nasıl kullanıyorum.

public class JsonTest { 
    public static <T> Object fromJson(String jsonAsString, Class<T> pojoClass) 
throws JsonMappingException, JsonParseException, IOException { 
     return m.readValue(jsonAsString, pojoClass); 
    } 

    public static String toJson(Object pojo, boolean prettyPrint) 
throws JsonMappingException, JsonGenerationException, IOException { 
     StringWriter sw = new StringWriter(); 
     JsonGenerator jg = jf.createJsonGenerator(sw); 
     if (prettyPrint) { 
      jg.useDefaultPrettyPrinter(); 
     } 
     m.writeValue(jg, pojo); 
     return sw.toString(); 
    } 

    public static void main(String[] args) { 
     Person p = new Person(); 
     String json = this.toJson(p, true); // converts ‘p’ to JSON just fine 
     Person personFromJson = this.fromJson(json, Person.class); // throws exception!!! 
    } 
} 

ana yöntemin 3. satırını (json'u Kişi nesnesine dönüştürmeyi denediğimde) bu istisnayı atar:

IOException: Can not deserialize Class com.mycompany.models.Person$Address (of type non-static member class) as a Bean 

neyi yanlış yapıyorum?

+2

Bu tür sınıfları serileştiremiyor gibi görünüyorsanız, http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html adresine bakın. –

+0

@Stas Kurilin - Bu yorumu Cevap, doğru olanı. – Perception

+0

@Perception, bitti. Ama umarım smb, ishaq'a daha iyi yardımcı olabilir. –

cevap

8

İç sınıfların varsayılan bir sıfır bağımsız değişken yapıcısı olmadığından (dış/üst sınıf için gizli bir başvuruları vardır) Jackson bunları oluşturamaz.

public class Outer { 
    static class Inner { 
     private String foo; 
     public String getFoo() { return foo; } 
    } 
} 

Orjinal Cevap:

çözüm static iç sınıfları kullanmaktır

Orada uygulanmasında bazı sorunlar vardır ve bunu, böyle sınıfları seri için cowtowncoder göremiyorum gibi görünüyor detaylar.

+0

siz efendim! Bir beyefendi olan –

3

Doğru, bu geçerli Jackson sürümleriyle (1.8 ve önceki sürümlerde) yapabileceğiniz bir şey değildi. Fakat iç sınıfın statik olmayan olması kesinlikle gerekli midir? Değilse, Adres beyanında 'statik' ekleyin ve iyi çalışır; Sorun, "gizli" olan bu gösterici ile statik olmayan iç sınıfların yapıcıdan aldıklarıdır.

Jackson 1.9 aslında statik olmayan iç sınıfların basit kullanımlarının serileştirilmesini destekleyecek, bkz. Bu Jira entry.

+0

evet, tam olarak yaptığım şey, iç sınıf bildirimlerine “statik” ekledi. Statik olmayan ve statik iç sınıfların nasıl farklı olduğunu bilmiyordu, şimdi biliyorum. Teşekkürler. –

+0

Tamam, bu kadar kolay oldu! :) – StaxMan

İlgili konular