这不再有很好的记录,但是该TypeHints
特征有两种方法:
def deserialize: PartialFunction[(String, JObject), Any] = Map()
def serialize: PartialFunction[Any, JObject] = Map()
TypeHints
在实现trait 时(或在扩展提供的默认实现时)可以覆盖这些方法,TypeHints
以便为具有指定类型提示的 JSON 对象指定自定义序列化和反序列化逻辑。默认实现(如上所示)实际上只是不匹配任何内容的部分函数,因此它们没有任何效果。
deserialize
中的和serialize
方法有一些不同Serializer
,这是我们之前的代码使用的:
这些方法不带Formats
参数,这意味着必须依赖Formats
范围内的实例。
它们在JObject
转换的 JSON 端进行操作,而不是它的超类型JValue
(显然,当您考虑它时 - 因为任何具有类型提示的东西都不可避免地必须是 JSON 对象,而不是字符串或数字或其他)。
它们不采用类型参数,只在Any
转换的 Scala 端进行操作——这是因为它们只处理需要在一个大的部分函数中自定义序列化逻辑的所有类型提示类型。
代替 a TypeInfo
,deserialize
偏函数采用 a String
,它是类型提示字段的值。
我认为这些差异大部分是因为这是较旧的 lift-json 代码,从Serializer
特征存在之前开始,并且只有一种方法可以进行自定义序列化。
所以对我有用的是:
def typeHints(implicit formats: Formats) = new OurTypeHintsImpl(
...键入提示信息...) {
override def deserialize = {
case ("type-hint-for-A", o: JObject) =>
...现有的反序列化代码...
}
override def deserialize = {
case A(
... ) =>
...现有的序列化代码...
}
并且要添加具有类型提示和自定义序列化逻辑的另一种类型,只需case
向上述两者添加一个新分支即可。
使用这种方法,lift-json 会自动添加正确的类型提示,但您仍然可以完全自定义其余序列化和反序列化的完成方式。所以我认为它是大多数情况下最方便和最合适的方法(但它确实需要一些重构)。也应该可以在 custom 中重新实现类型提示Serializer
,但为什么要重新发明轮子呢?
警告:默认情况下,类型上的大小写匹配对泛型类型有限制,但这对于此目的通常不重要 - 除非您不是独立序列化包含在另一个类型中的泛型类型,而是将其合并到外部类型中在 JSON 中。