如何使用Moshi以2种不同方式解析字段

时间:2019-04-19 10:22:01

标签: json kotlin adapter moshi

我需要解析一个包含属性“触发器”的对象,该属性为List<Trigger>。此列表可以包含两种类型的触发器:“自定义”和“事件”。 这是我的Trigger类:

  @JsonClass(generateAdapter = true)
    open class Trigger(open val type: String,
                       open val source: String,
                       open val tags: Properties? = mutableMapOf())

  @JsonClass(generateAdapter = true)
    data class CustomTrigger(override val type: String,
                             override val source: String,
                             override val tags: Properties?,
    //some other fields
    ) : Trigger(type, source, tags)

@JsonClass(generateAdapter = true)
data class EventTrigger(override val type: String,
                         override val source: String,
                         override val tags: Properties?,
    //some other fields
) : Trigger(type, source, tags)

我从服务器收到的对象看起来像这样:

@JsonClass(generateAdapter = true)
data class Rule(val id: String,
                val triggers: MutableList<Trigger>,
//some other fields
)

在解析时使用生成的适配器,我仅触发Trigger类中的字段。我需要实现一种逻辑来解析类型为“事件”的EventTrigger或类型为“自定义”的CustomTrigger

如何使用Moshi来做到这一点? 我需要为我的Rule对象写一个手动解析器吗?

任何想法都值得欢迎。谢谢

2 个答案:

答案 0 :(得分:0)

看看PolymorphicJsonAdapterFactory

Moshi moshi = new Moshi.Builder() 
    .add(PolymorphicJsonAdapterFactory.of(HandOfCards.class, "hand_type")
        .withSubtype(BlackjackHand.class, "blackjack")
        .withSubtype(HoldemHand.class, "holdem")) 
    .build(); 

请注意,它需要可选的moshi-adapters依赖项。

答案 1 :(得分:0)

Moshi中的此示例帮助我解决了解析问题: https://github.com/square/moshi#another-example