2016-07-17 25 views
5

ile ilgili Sorunu en iyi nasıl açıklayacağından emin değilim, bu yüzden daha iyi bir tanıtım için hem java hem de kotlin ile aynı kodu çektim.Kotlin, Jackson Deserialization hatası veri sınıfı

JSON'u okuduğumda, parametrenin başlangıç ​​ile başlaması için bir değer bile olmasa bile veri çekirdeği değerinin NULL olması zorlanıyor ve veri çekirdeği eksik alanın değerini varsayılan olarak ayarlıyor. Java'da, hiçbir zaman başlangıçta verilmeyen değeri asla geçersiz kılmaya çalışmaz. Kotlin'de kopmaz gibi görünüyor çünkü null olmayan bir alanı geçersiz kılmaya çalışıyor. KOTLIN yılında

Java'da

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Pojo.<init>, parameter ts 

bir istisna atar

data class Pojo(val name: String, val age: Int, val list: List<String> = emptyList(), val ts: Date = Date()) 

private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) 
    .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) 

fun main(args: Array<String>) { 
    mapper.readValue("""{"name": "John Doe", "list": ["yellow", "green"], "age": 42}""", Pojo::class.java) 
} 

Bir verinin yerine bir sınıf yapmak bile

public class Transform { 
    private static ObjectMapper mapper = new ObjectMapper() 
     .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 

    public static class Pojo { 
    private String name; 
    private int age; 
    private List<String> list; 
    private Date ts = new Date(); 
    <getters and setters for all> 
    } 

    public static void main(String[] args) throws IOException { 
    String json = "{\"name\": \"John Doe\", \"list\": [\"yellow\", \"green\"], \"age\": 42}"; 
    Pojo p = mapper.readValue(json, Pojo.class); 
    System.out.printf("Bean: name=%s, age=%s, list=%s, ts=%s\n", p.name, p.age, p.list, p.ts); 
    } 
} 

(her şey iyi çalışır) kotlin sınıf, hala aynı şekilde hatalar.

Soruma göre, Jackson serisinden POIOS'umla Kotlin'de çalışmaya nasıl başlayabilirim. Beklenen davranış, boş/yanlış bir değerin null izin verilmeyen bir şey için geçirilmesi durumunda "kesilmesi" dir. Ancak, ts alanını bir boşluğa dönüştürmek için hiçbir girişimde bulunulmamış olan senaryoda, java ile olduğu gibi varsayılan değeri kullanması gerekirdi.

hiç veri fasulye kavramını kullanmaz ve

class Pojo(val name: String, val age: Int) { 
    var list: List<String> = emptyList() 
    var ts: Date = Date() 
} 

Ama sonra benim .equals çalışmak ve bunun görmemiş gibi benim fasulye yazmaktır iş gibi görünüyor gelir aklıma tek şey diğerlerinin, salt okunur olmalarını istediklerinde, listenin içeriğini ve ts özelliklerini manipüle etmelerine izin verir.

cevap

10

jackson-kotlin-module bunun 2.8.0 sürümü ile:

şimdi

Aşağıdaki örnek özelliğini göstermektedir yapıcı ve yaratıcısı yöntemlerinde varsayılan değerleri kullanarak destekler:

data class Question(val title: String = "Is programming hard?", val answer: String) 

val q = mapper.readValue<Question>("""{"answer": "Sure it can be"}""") 
println(q) //-> Question(title=Is programming hard?, answer=Sure it can be) 
+2

Doğru, bu değişiklik 2.8.x için yeni ve * eski sürümlere geri yüklenemez *, bu nedenle eklenti modüllerine daha fazla denetim vermek için açıkça Jackson'a yeni API'ler eklendikçe yükseltmeniz gerekir. –

+0

Teşekkürler, bu hile yaptı. 2.7 kullanıyordum.Bu küçük çabayı başladığım anda en son olan 5 idi. Aklımı asla geçmedim ki, lib'leri yükseltmek için ihtiyacım vardı. Kolay bir düzeltme için sevindim. – Ryba

-1

Gelen özelliklerden birinin boş olduğunu düşünüyorum, bu nedenle boş olabileceği jsonProperty öğesinden sonra ?'u yerleştirmeniz gerekecektir (durumda bu sizin tarih alanınızdır). Ayrıca, testiniz için ham String veri türünü, """\unescaped string"""ile birlikte kullanabilirsiniz, bu nedenle bu sınıfın içindeki gibi olmalıdır. Ve türü yeniden tanımlamak zorunda değilsiniz. Yani son kararım olacaktır: data class Pojo(val name: String, val age: Int, val list: List<String>, val ts: Date?)

+1

O hakkında sordu Jackson 2.8.0 ileri (Miensol bahseder gibi) sadece iyi çalışır, parametre için bir varsayılan değeri olan bir durumda. Ve bu sürüm için nullabilirlik daha akıllıdır. 2.8.0 kullanıyorsa sorun olmazdı. –