相关疑难解决方法(0)

将Kotlin数据对象映射到数据对象的更好方法

我想将一些"数据"类对象转换/映射到类似的"数据"类对象.例如,Web表单的类到数据库记录的类.

data class PersonForm(
    val firstName: String,
    val lastName: String,
    val age: Int,
    // maybe many fields exist here like address, card number, etc.
    val tel: String
)
// maps to ...
data class PersonRecord(
    val name: String, // "${firstName} ${lastName}"
    val age: Int, // copy of age
    // maybe many fields exist here like address, card number, etc.
    val tel: String // copy of tel
)
Run Code Online (Sandbox Code Playgroud)

我在Java中使用ModelMapper进行此类工作,但由于数据类是final(ModelMapper创建CGLib代理以读取映射定义),因此无法使用它.当我们打开这些类/字段时,我们可以使用ModelMapper,但是我们必须手动实现"data"类的功能.(参见ModelMapper示例:https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java)

如何在Kotlin中映射这样的"数据"对象?

更新: ModelMapper自动映射具有相同名称的字段(如tel - > tel),而不映射声明.我想用Kotlin的数据类来做.

更新: 每个类的目的取决于应用程序的类型,但这些应用程序可能位于应用程序的不同层. …

java modelmapper kotlin

50
推荐指数
4
解决办法
4万
查看次数

使用Kotlin进行Gson反序列化,不调用初始化程序块

我创建对象时,我的初始化程序块工作正常

class ObjectToDeserialize(var someString: String = "") : Serializable {
    init{
        someString += " initialized"
    }
}
Run Code Online (Sandbox Code Playgroud)

这条路:

@Test
fun createObject_checkIfInitialized() {
      assertEquals("someString initialized",ObjectToDeserialize("someString").someString)
}
Run Code Online (Sandbox Code Playgroud)

但是当我用Gson反序列化对象时,初始化块不会被执行:

@Test
fun deserializeObject_checkIfInitialized(){
    val someJson: String = "{\"someString\":\"someString\" }"
    val jsonObject = Gson().fromJson(someJson, ObjectToDeserialize::class.java)

    assertEquals("someString initialized",jsonObject.someString)

    // Expected :someString initialized
    // Actual   :someString
}
Run Code Online (Sandbox Code Playgroud)

我认为gson以不同于执行主构造函数的方式创建对象.是否有可能像初始化程序块一样有类似的东西?


gson kotlin

12
推荐指数
1
解决办法
2563
查看次数

在Kotlin,Jackson反序列化错误与数据类

不确定如何最好地解释问题,所以我提出了与java和kotlin相同的代码以更好地演示.

当我读取JSON时,它似乎强制数据bean值为NULL,即使该参数甚至不是json的一部分,并且数据bean默认为缺少字段的值.在java中,它正常工作,从不尝试使从未提供的值无效.在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)
}
Run Code Online (Sandbox Code Playgroud)

这引发了例外

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Pojo.<init>, parameter ts
Run Code Online (Sandbox Code Playgroud)

在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> …
Run Code Online (Sandbox Code Playgroud)

json jackson kotlin

6
推荐指数
1
解决办法
3435
查看次数

标签 统计

kotlin ×3

gson ×1

jackson ×1

java ×1

json ×1

modelmapper ×1