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

44u64gxh  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(510)

该代码基于以下链接:Link
我收到一个运行时异常:
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 name = json.asString

这是 deserialize 方法的一部分,可能在我编写以下代码时调用:

val student = gSon.fromJson<Student>(json2, Student::class.java)

当我站在这一行上并按下ctrl + B键盘时,它会将我带到JsonElement类,我会看到以下方法:

public String getAsString() {
  throw new UnsupportedOperationException(getClass().getSimpleName());
}

正如我们所看到的,这里只有一个throw语句。2但是如果我们阅读方法文档,我们会发现在那里写着throw语句happen只是方法的一部分。

/**

* 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() {
   ...

我的问题是:
1.全面落实在哪里?
1.为什么当我点击ctrl + B时会出现这样的代码:someJsonObject.asString,我猜它是一个属性,它将我带到名为的方法:getAsString这是否意味着 asString 属性的get()实现是:是否返回getAsString(this)?

axzmvihb

axzmvihb1#

JsonElement::getAsString()只适用于 *json基元 *。基元是字符串、数字和布尔值。您的json示例是JsonObject,因此不是基元,这意味着没有getAsString()的实现,它返回一个有意义的值。
从教程中,您实际上应该执行json.get("name").asString
json.get("name")将返回name元素,其类型为JsonPrimitive-〉一个json原语,您可以在该原语上调用getAsString()
为了进一步澄清,这是json的内容:

{
   "name": "Mark",
   "address": {
        "city": "London",
        "post": "12000"
    }
 }

并且这是json.get("name")的含量:

"Mark"

然后在调用getAsString()/asString时将得到字符串Mark
另请参阅:GSON JsonElement.getAsString vs. JsonElement.toString?
对于您关于源代码的问题,JsonPrimitiveJsonObject的子类。在导航时,IDE只知道它必须是JsonObject,但在运行时,它会看到它实际上是一个原语,并调用JsonPrimitive::getAsString()。该代码的源代码如下:https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonPrimitive.java#L137-L151
这是gson利用继承的结果。如果你需要进一步的帮助来理解这一点,我推荐阅读一些Java面向对象编程的初学者材料。

相关问题