我已经在Java中反序列化了一些嵌套字段,遵循https://www.baeldung.com/jackson-nested-values的说明(第5节):
@JsonProperty("brand")
private void unpackNested(Map<String,Object> brand) {
this.brandName = (String)brand.get("name");
Map<String,String> owner = (Map<String,String>)brand.get("owner");
this.ownerName = owner.get("name");
}
ownerName
是bean中的一个字段。
现在,我需要在Kotlin中做一些类似的事情,但我对目前所做的并不满意。假设我有一个MyPojo
类,它有一个createdAt
字段,但在表示它的JSON中,该字段嵌套在metadata
属性下:
data class MyPojo(var createdAt: LocalDateTime = LocalDateTime.MIN) {
@JsonProperty("metadata")
private fun unpackNested(metadata: Map<String, Any>) {
var createdAtAsString = metadata["createdAt"] as String
this.createdAt = LocalDateTime.parse(createdAtAsString,DateTimeFormatter.ISO_DATE_TIME)
}
}
我不喜欢这里的一件事是,我被迫使createdAt
成为var
,而不是val
。
有没有一个Kotlin技巧可以让这里的事情变得更好?
2条答案
按热度按时间lb3vh1jj1#
为了简单起见,我使用
Int
作为createdAt
的类型。你可以这样做:
createdAt
将是一个具有默认值的参数。由于数据类的构造函数只能有属性(var
/val
),你将失去data class的优势(toString()
开箱即用等)。在示例化类时,将此参数分配给
private var _createdAt
。唯一会暴露给外部的是一个没有后台字段
createAt
的属性(在Java术语中只是一个getter)。因此,_createdAt
在示例化后不能更改。现在有两种情况:
1.如果示例化该类,
_createdAt
将被设置为您指定的值。1.如果Jackson示例化了类,
_createdAt
的值将被unpackNested
调用覆盖。下面是一个例子:
c7rzv4ha2#
请检查这是否适合你