在 json4s 中解析自动类型提示
Automatic type hints resolving in json4s
假设我有一个 class 层次结构,例如:
trait Event
case class ThisEvent extends Event
case class ThatEvent extends Event
case class AnotherEvent extends Event
目前在我的序列化代码中我必须使用这个:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[ThisEvent], classOf[ThatEvent], classOf[AnotherEvent]))
}
但我更喜欢这样的东西:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[Event]))
}
你会如何解决这个问题?
如果可以使 Event
成为密封特征,则可以使用宏解释 here 迭代其子类,方法是引入具有所需辅助方法的 SealedExample
对象.该示例仅获取扩展密封特征的对象,但您可以轻松地将其修改为每个子类的 return classOf
。然后你可以这样做:
override val typeHints = ShortTypeHints(SealedExample.values[Event].toList)
否则,不幸的是,Scala 中没有本地方法在编译时生成特征的子类型列表。
假设我有一个 class 层次结构,例如:
trait Event
case class ThisEvent extends Event
case class ThatEvent extends Event
case class AnotherEvent extends Event
目前在我的序列化代码中我必须使用这个:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[ThisEvent], classOf[ThatEvent], classOf[AnotherEvent]))
}
但我更喜欢这样的东西:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[Event]))
}
你会如何解决这个问题?
如果可以使 Event
成为密封特征,则可以使用宏解释 here 迭代其子类,方法是引入具有所需辅助方法的 SealedExample
对象.该示例仅获取扩展密封特征的对象,但您可以轻松地将其修改为每个子类的 return classOf
。然后你可以这样做:
override val typeHints = ShortTypeHints(SealedExample.values[Event].toList)
否则,不幸的是,Scala 中没有本地方法在编译时生成特征的子类型列表。