Заполнение класса данных Kotlin с помощью Gson - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь заполнить класс данных Kotlin из соответствующего строкового значения. Я посмотрел на: Класс данных Kotlin от Json, использующий GSON , но я пытаюсь сделать то же самое:

fun convertStringToObject(stringValue: String?, clazz: Class<*>): Any? {
    return if (stringValue != null) {
        try {
            val gson = Gson()

            gson.fromJson<Any>(stringValue, clazz)
        }
        catch (exception: Exception) {
            // yes, we are swallowing the possible 
            // java.lang.IllegalStateException
            null
        }
    }
    else {
        null
    }
}

Вызов этой функции и попытка заполнить следующий класс:

data class LoggedUser(
    @SerializedName("id") val id: Long,
    @SerializedName("name") val name: String,
    @SerializedName("first_name") val firstName: String,
    @SerializedName("last_name") val lastName: String,
    @SerializedName("email") val email: String
)

Выполняется, но значения LoggedUser пусты (null).

Значение строки в настоящее время:

{"nameValuePairs":{"id":"1654488452866661","name":"Bob Smith","email":"bob.smith@test.net","first_name":"Bob","last_name":"Smith"}}

Я даже пытался использовать жестко закодированное значение класса, например:

gson.fromJson(stringValue, LoggedUser::class.java)

но радости не было. stringValue - это то, что gson.toJson (значение) сгенерировано, где значение было JSONObject.

У кого-нибудь есть идея, что такое отключение?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Создать класс-оболочку

data class LoggedUserWrapper{
    @SerializedName("nameValuePairs") val nameValuePairs: LoggedUser
}

и выполнить

val loggedUser = convertStringToObject(yourJsonString, LoggedUserWrapper::class.java)

Это тебе поможет.

0 голосов
/ 03 июля 2018

Ваша строка JSON на самом деле имеет два объекта JSON: внешнее значение (которое имеет ключ с именем nameValuePairs) и значение, которое вы на самом деле хотите десериализовать (которое является значением в ключе nameValuePairs). Вам нужно погрузиться на один уровень глубже, либо через внешний класс-обертку, который содержит ваш объект User, либо вручную получив JsonObject с ключом nameValuePairs в виде строки, а затем передав его в Gson. Если бы строка была просто {"id":"1654488452866661","name":"Bob Smith","email":"bob.smith@test.net","first_name":"Bob","last_name":"Smith"}, она бы отлично десериализовалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...