如何从json构建我的Kotlin API类? (使用Moshi)

时间:2018-05-08 14:09:49

标签: kotlin moshi

我正在重构并添加到应用的API通信中。我想为我的" json数据对象"实现这种用法。直接使用属性或从json字符串实例化。

userFromParams = User("user@example.com", "otherproperty")
userFromString = User.fromJson(someJsonString)!!
// userIWantFromString = User(someJsonString)

让userFromParams序列化为JSON不是问题。只需添加一个toJson()函数就可以解决这个问题。

data class User(email: String, other_property: String) {
    fun toJson(): String {
        return Moshi.Builder().build()
                .adapter(User::class.java)
                .toJson(this)
    }

    companion object {
        fun fromJson(json: String): User? {
            val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
            return moshi.adapter(User::class.java).fromJson(json)
        }
    }
}

来自Json"我想摆脱......因为...我想,我无法弄清楚如何。上面的类工作(给予或采取允许返回或不返回可选对象等)但它只是让我感到困惑,我试图达到这个漂亮的干净重载初始化。

它也不一定非必须是数据类,但它在这里似乎是合适的。

1 个答案:

答案 0 :(得分:2)

你无法以任何高效的方式做到这一点。任何构造函数调用都将实例化一个新对象,但由于Moshi在内部处理对象创建,因此您将有两个实例...

如果你真的真的想要它,你可以尝试类似的东西:

class User {
    val email: String
    val other_property: String

    constructor(email: String, other_property: String) {
        this.email = email
        this.other_property = other_property
    }

    constructor(json: String) {
        val delegate = Moshi.Builder().build().adapter(User::class.java).fromJson(json)
        this.email = delegate.email
        this.other_property = delegate.other_property
    }

    fun toJson(): String {
        return Moshi.Builder()
                .add(KotlinJsonAdapterFactory())
                .build()
                .adapter(User::class.java)
                .toJson(this)
    }
}