为什么在使用Gson.asString时会出现java.lang.UnsupportedOperationException?

为什么在使用Gson.asString时会出现java.lang.UnsupportedOperationException?,java,android,json,kotlin,gson,Java,Android,Json,Kotlin,Gson,该代码基于以下链接: 我收到一个运行时异常: 运行以下代码时,java.lang.UnsupportedOperationException:JsonObject: data class Student( var name: String? = null, var address: String? = null) { } class StudentDeserializer : JsonDeserializer<Student> {

该代码基于以下链接:

我收到一个运行时异常:

运行以下代码时,
java.lang.UnsupportedOperationException:JsonObject

data class Student(
    var name: String? = null,
    var address: String? = null) {
}

    class StudentDeserializer : JsonDeserializer<Student> {
    
        override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Student {
            json as JsonObject
    
            val name = json.asString
            val addressJson = json.get("address")
            val address = if (addressJson.isJsonObject) addressJson.toString() else addressJson.asString
            return Student(name, address)
        }
    }
这是反序列化方法的一部分,在我编写时可能会调用该方法:

        val student = gSon.fromJson<Student>(json2, Student::class.java)
正如我们所看到的,这里只有一个throw语句。但是如果我们阅读了方法文档,我们会看到其中写的throw语句只是方法的一部分

/**
* convenience method to get this element as a string value.
*
* @return get this element as a string value.
* @throws ClassCastException if the element is of not a {@link JsonPrimitive} and is not a valid
* string value.
* @throws IllegalStateException if the element is of the type {@link JsonArray} but contains
* more than a single element.
*/
public String getAsString() {
   ...
我的问题是:

  • 全面实施在哪里
  • 为什么我在代码中单击ctrl+b,如: someJsonObject.asString,我猜它是一个属性,它将我带到名为:
    getAsString
    这是否意味着asString属性的get()实现是:return getAsString(this)

  • JsonElement::getAsString()
    仅适用于json原语。原语是字符串、数字和布尔值。您的
    json
    实例是一个
    JsonObject
    ,因此不是一个原语,这意味着返回有意义值的
    getAsString()
    没有实现

    在本教程中,您实际上应该执行
    json.get(“name”).asString

    json.get(“name”)
    将返回类型为
    JsonPrimitive
    ->的
    name
    元素,您可以在该元素上调用
    getAsString()

    为了进一步澄清,以下是
    json
    的内容:

    {
    “名称”:“标记”,
    “地址”:{
    “城市”:“伦敦”,
    “职位”:“12000”
    }
    }
    
    这是json.get(“name”)的内容:

    当调用
    getAsString()
    /
    asString
    时,这将导致字符串
    标记


    另见:


    关于源代码的问题
    JsonPrimitive
    JsonObject
    的子类。当您导航时,IDE只知道它必须是一个
    JsonObject
    ,但在运行时,它会看到它实际上是一个原语,并调用
    JsonPrimitive::getAsString()
    。其来源如下:


    这是gson利用继承的结果。如果您需要进一步的帮助来理解这一点,我建议您阅读一些Java面向对象编程的初学者资料。

    请帮助我:(我希望我能配合:(您应该编写val name=json.get(“name”).asString@LucaPizzini,这真的很有帮助。但是,即使在改变了你所说的方式之后,ctrl+b仍然会让我找到属于JsonElement类的同一个方法。你能猜到为什么吗?谢谢。另外,也许你可以说为什么asString(来自getAsString())方法上的ctrl+b会导致getAsString方法?这是什么意思*来自getAsString()?@DorVak
    getAsString
    是java方法。
    asString
    是kotlin将getter转换为属性的方法。它只是语法上的糖分。没有实际的属性/方法叫做
    asString
    谢谢你的耐心。我是kotlin的新手(一个月)这对我来说很难。你很善良,很难相处。你能解释一下吗,我认为对于java中的每个类,Kotlin中都有一个合适的类,在我们的JsonPrimitive中,有一个Kotlin类,它的属性返回一个字符串。但根据你的回答,实际上没有这样的属性。我不会真正找到Kotli我很高兴能更好地理解它,因为它让我miserable@DorVakkotlin与Java无缝互操作。每个Java类都没有“kotlin类”。您可以直接从kotlin调用Java代码。但是,Java的一般结构和命名约定不是“kotlin样式”因此,Kotlin为您提供了一种使调用java的代码更“类似Kotlin”的方法,并将getter和setter作为属性提供。例如,代码
    foo.asString
    foo.getAsString()
    完全等效。@DorVak请参阅有关Kotlin如何与java互操作的文档
    public String getAsString() {
      throw new UnsupportedOperationException(getClass().getSimpleName());
    }
    
    /**
    * convenience method to get this element as a string value.
    *
    * @return get this element as a string value.
    * @throws ClassCastException if the element is of not a {@link JsonPrimitive} and is not a valid
    * string value.
    * @throws IllegalStateException if the element is of the type {@link JsonArray} but contains
    * more than a single element.
    */
    public String getAsString() {
       ...
    
    "Mark"