gson 莫希字符串动态多态适配器

pgvzfuti  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(155)

在Gson,我可以这样做:

//mapItem - item of map with info for which class should string be deserialized
BaseReqClass req = (BaseReqClass) gson.fromJson(jsonString, mapItem.getValue());
req.doSomeStuff()

其中

class AReq : BaseReqClass()
class BReq : BaseReqClass()

我选择mapItem是基于map键,它也清楚地定义了一个子类,莫希应该引用这个子类(mapItem.getValue())。
我应该怎么做才能让莫希有同样的行为呢?我知道它是PolymorphicJsonAdapterFactory,但是我不想在我的json中有一个特殊的字段。

velaa5lx

velaa5lx1#

好的,我找到了解决方案。因为mapItem,我知道我应该做什么。所以我实现了这样的东西:

val rsp =
    "{\"token\":\"ABC\",\"data\":{\"id\":\"1234\",\"hash\":\"9N6PpUW9H8T6tuEc1wcvWu\"},\"locale\":\"EN\"}";

//val rsp = "{\"token\":\"FGH\",\"data\":{\"somefield\":\"someString\",\"otherid\":\"555\"},\"locale\":\"EN\"}"

val factory: JsonAdapter.Factory
if (getServiceName() == "areq") {
    factory = ResultJsonAdapterFactory.of(BaseReqClass::class.java)
            .withSubtype(AReq::class.java)
} else {
    factory = ResultJsonAdapterFactory.of(BaseReqClass::class.java)
            .withSubtype(BReq::class.java)
}

val moshi = Moshi.Builder()
    .add(factory)
    .build()

val jsonAdapter = moshi.adapter(BaseReqClass::class.java)

val req = jsonAdapter.fromJson(rsp)
println("serialized: ${jsonAdapter.toJson(req)}")

我可以从顶部的注解交换rsp,并将莫希数据反序列化到第二个类对象。

相关问题