2013-06-25 21 views
15

JSON olarak geçirilen bir nesnenin iç sınıf türünü oluşturmaya çalışıyorum ancak burada ve ayrıca Jackson'ın sitesinde tonlarca okurken bunu elde edemiyorum. Doğru kombinasyon böylece herhangi birisi herhangi bir işaretçi varsa çok takdir edilecektir. Aşağıda bazı parçacıkları yayınladım ve tüm alıcıları ve ayarlayıcıları kaldırdım, yayınlamaya ihtiyaçları olduğunu anlamadım. Jackson 2.2 kullanıyorum.Jackson Json Tür Eşleme İç Sınıf

Ben çalışılıyor sınıfları serisini:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 

    public class Criteria { 
    private String restriction; 
    private Object value; 
    } 
} 

kod ben serisini kullanıyorum:

ObjectMapper om = new ObjectMapper(); 
TypeFactory tf = om.getTypeFactory(); 
JavaType map = tf.constructMapLikeType(Map.class, String.class, Criteria.class); 
JavaType type = typeFactory.constructType(Settings.class, map); 
Settings settings = om.readValue(entity, type); 

Benim JSON test veriler:

{ "type": "org.json.Car", "criteria": { "restriction": "eq", "value": "bmw" } } 
+1

İç sınıf statik olmalıdır. Bkz. Http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – Paul

+0

Bu talimatları uygularken hatayı alıyorum: "Üye türü [sınıf adı] statik olarak bildirilemez; statik türler yalnızca Statik veya üst düzey türlerinde bildirilmiştir " – coltonfranco

+0

Yuvalama sınıfları ve jackson hakkında daha fazla bilgi için bu blog postasına bakın. Serileştirme iyi çalışır, ancak sınıf statik iç içe tip değilse, deserialization olmaz - http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – testerjoe2

cevap

4

Eğer Daha sonra hayatınızı kolaylaştırabilir ve iç sınıfı, Ayarlar sınıfındaki bir referansla normal bir sınıfa taşıyabilir. Ve sonra burada size sınıfları nasıl olduğunu jackson kullanarak sıralanırken yapın:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 
    private Criteria criteria; 
} 


class Criteria { 
    private String restriction; 
    private Object value; 
    } 
+0

Gerçekten de tüm soruna neden olan iç sınıftı. – ars265

+3

Veya 'static' kullanın –

33

doğru cevap size iç sınıfı statik anahtar sözcüğü eksik olmasıdır.

Sadece "statik" anahtar kelimenin orada olduğundan emin olun.

http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html

size 3 dakika sürer ancak günün geri kalanı için seni mutlu okuyun.

+1

Bu kabul edilen yanıt olmalıdır. –

+0

redochka - Statik iç içe geçmiş sınıfın (anwer'in) mi yoksa basitçe kompozisyonun mu (taklit ahsan cevabı) kullanıldığına nasıl karar veririz? – testerjoe2

+0

@ testerjoe2 kişisel bir tercih meselesidir. Yuvalanmış statik bir sınıf kullanıyorum, çünkü başka bir yerde kullanılmayacağını biliyorum çünkü bu, barındırma sınıfıyla sıkı bir şekilde ilişkili. Bu sınıfı başka bir yerde kullanacaksam, kesinlikle ayrı bir sınıfa koyuyorum. – redochka