该代码基于以下链接: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)?
1条答案
按热度按时间axzmvihb1#
JsonElement::getAsString()
只适用于 *json基元 *。基元是字符串、数字和布尔值。您的json
示例是JsonObject
,因此不是基元,这意味着没有getAsString()
的实现,它返回一个有意义的值。从教程中,您实际上应该执行
json.get("name").asString
。json.get("name")
将返回name
元素,其类型为JsonPrimitive
-〉一个json原语,您可以在该原语上调用getAsString()
。为了进一步澄清,这是
json
的内容:并且这是
json.get("name")
的含量:然后在调用
getAsString()
/asString
时将得到字符串Mark
。另请参阅:GSON JsonElement.getAsString vs. JsonElement.toString?
对于您关于源代码的问题,
JsonPrimitive
是JsonObject
的子类。在导航时,IDE只知道它必须是JsonObject
,但在运行时,它会看到它实际上是一个原语,并调用JsonPrimitive::getAsString()
。该代码的源代码如下:https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonPrimitive.java#L137-L151这是gson利用继承的结果。如果你需要进一步的帮助来理解这一点,我推荐阅读一些Java面向对象编程的初学者材料。