代码之家  ›  专栏  ›  技术社区  ›  Perry Hoekstra

使用Gson填充Kotlin数据类

  •  1
  • Perry Hoekstra  · 技术社区  · 7 年前

    Kotlin Data Class from Json using 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)。

    stringValue当前为:

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

    我甚至试着使用这样的硬编码类值:

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

    字符串值 gson.toJson文件(值) 生成位置 价值 是一个JSONObject。

    有人知道我的脱节是什么吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Eric Bachhuber    7 年前

    JSON字符串实际上有两个JSON对象,外部值(它有一个名为 nameValuePairs 名称值对 ). 您需要更深一层,要么通过保存用户对象的外部包装类,要么通过手动获取键处的JsonObject 然后把它传给Gson。如果绳子只是 {"id":"1654488452866661","name":"Bob Smith","email":"bob.smith@test.net","first_name":"Bob","last_name":"Smith"} 它可以反序列化。

        2
  •  2
  •   Brijesh Joshi    7 年前

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

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

    这对你有帮助。