为什么在使用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() {
...
我的问题是:
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()?@DorVakgetAsString
是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"