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.
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. –
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