gpt4 book ai didi

json - 在 Kotlin 中, jackson 反序列化错误与数据类

转载 作者:IT老高 更新时间:2023-10-28 13:44:11 25 4
gpt4 key购买 nike

不太确定如何最好地解释这个问题,所以我编写了与 java 和 kotlin 相同的代码以更好地演示。

当我阅读 JSON 时,它似乎强制数据 bean 值为 NULL,即使该参数甚至不是 json 的一部分,并且数据 bean 默认缺少字段的值。在 java 中,它可以正常工作,永远不会试图取消从未提供过的值。在 Kotlin 中,它似乎会中断,因为它试图使不可为空的字段无效。

在 Kotlin 中

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

抛出异常

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

在 Java 中(一切正常)

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

即使我在 kotlin 中将其设为类而不是数据类,它仍然会以同样的方式出错。

我的问题是,我怎样才能让 Jackson 反序列化与我的 POJO 一起在 Kotlin 中工作。预期的行为是,如果为不允许 null 的内容传入 null/不正确的值,它“应该”中断。但是在上面根本没有尝试将 ts 字段更改为 null 的场景中,它应该像使用 java 一样使用默认值。

我唯一想到的似乎可行的事情就是根本不使用数据bean的概念,而是像这样编写我的bean

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

但是我的 .equals 不起作用,当我希望它们为只读时,它允许下游的其他人操作列表和 ts 属性的内容。

最佳答案

使用 2.8.0发布jackson-kotlin-module它:

now supports using default values in constructor and creator methods

以下示例描述了该功能:

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)

关于json - 在 Kotlin 中, jackson 反序列化错误与数据类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com