Как мои классы Kotlin API могут быть построены из json? (используя Моши) - PullRequest
0 голосов
/ 08 мая 2018

Я выполняю рефакторинг и добавляю в 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)
        }
    }
}

Это "от Джона", от которого я хотел бы избавиться ... потому что ... я хочу и не могу понять, как. Вышеприведенный класс работает (дай или возьми, чтобы разрешить возвращение необязательного объекта или нет и т. Д.), Но он просто мешает мне застрять, пытаясь добраться до этой красивой чистой перегруженной инициализации.

Это не обязательно должен быть класс данных, но здесь это кажется уместным.

1 Ответ

0 голосов
/ 08 мая 2018

Вы не можете сделать это любым быстрым способом. Любой вызов конструктора создаст экземпляр нового объекта, но, поскольку 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)
    }
}
...