此问题在此处已有答案:
Gson doesn't serialize fields defined in subclasses(4个答案)
去年关闭了。
当Errorneous
位于其他Object
内部时,GSON无法正确地将Errorneous
转换为JSON。
但是当它被转换为顶级对象时,它工作得很好。为什么,如何修复它?
示例:
import com.google.gson.GsonBuilder
sealed class Errorneous<R> {}
data class Success<R>(val result: R) : Errorneous<R>()
data class Fail<R>(val error: String) : Errorneous<R>()
class Container(val value: Errorneous<String>)
fun main() {
print(GsonBuilder().create().toJson(Container(Fail("some error"))))
print(GsonBuilder().create().toJson(Fail<String>("some error")))
}
输出量
{"value":{}}
{"error":"some error"}
但应该是
{"value":{"error":"some error"}}
{"error":"some error"}
2条答案
按热度按时间oknrviil1#
我在帖子下面对Gson的行为做了一些评论(简而言之:没有足够运行时类型信息),因此这只是使其工作并使其实际具有类型感知的代码。
正如您所看到的,类型适配器工厂首先解析
Success
和Fail
的类型适配器,然后使用instanceof
()基于Errorneous
值的实际类选择一个合适的类型适配器。以下是它打印的内容:
由于反序列化必须决定JSON的反序列化方式,因此该操作不受支持:1)或者在类型指示符字段上(参见Gson extras中的
RuntimeTypeAdapterFactory
,其在GitHub上的存储库中;它没有作为工件捆绑和发布); 2)或分析对象的结构,进行启发式分析(更难实现,并且可能面临不明确的情况)。我不使用Kotlin,但是上面的Java代码可能可以很容易地在IntelliJ IDEA中转换成Kotlin对应代码。
06odsfpq2#
Kotlin中的答案复制自类似的Java问题