假设我有一个带有以下设置的案例类:
case class Place(id:java.util.UUID, name:String)
我可以为这种类型写一个(working!)序列化器,如下所示:
class placeSerializer extends CustomSerializer[Place]( format => (
{
case JObject(JField("id", JString(s)) :: JField("name",JString(x)) :: Nil ) =>
Place(UUID.fromString(s), x)
},
{
case x:Place =>
JObject(
JField("id", JString(x.id.toString())) ::
JField("name", JString(x.name)) :: Nil)
}
)
)
但假设我的case类最终有更多的字段,这可能导致我用AST枚举对象的整个结构,创建一些非常详细的东西来编码基元。
json4s似乎具有只能在特定字段上起作用的字段序列化程序,其中包含样板方法以轻松转换名称和丢弃字段。然而,这些具有以下签名 serialize
和 deserialize
部分功能:
case class FieldSerializer[A: Manifest](
serializer: PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
deserializer: PartialFunction[JField, JField] = Map()
)
以来 JField
(代表键的类型 - > json中的val)是它自己的类型而不是它的子类 JValue
,我如何组合这两种类型的序列化器来正确编码 id
键名称为a UUID
,同时保持其他字段(原始数据类型)的默认处理。
基本上我想要一个理解其中的领域的格式链 Place
是一个UUID,无需为所有字段指定AST结构 DefaultFormats
已经可以处理了。
我特别想要的是模仿类似于的模式 JSONEncoder
和 JSONDecoder
python中的接口,可以使用键名和值类型来确定如何处理字段的编组。