Предположим, что у меня есть класс case со следующей установкой:
case class Place(id:java.util.UUID, name:String)
Я могу написать (рабочий!) сериализатор для этого типа следующим образом:
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
(тип, представляющий ключ → val от json), является его собственным типом, а не подклассом JValue
, как я могу объединить эти два типа сериализаторов для правильного кодирования id
по его имени, до UUID
, сохраняя при этом обработку по умолчанию других полей (которые являются примитивными типами данных).
По сути, я хотел бы, чтобы цепочка формата, которая понимает поле внутри Place
, является UUID, без необходимости указывать структуру AST для всех полей, которые уже могут обрабатывать DefaultFormats
.
То, что я ищу специально, - это подражать шаблону, аналогичному JSONEncoder
и JSONDecoder
интерфейсам в python, которые могут использовать имя ключа как а также тип значения, чтобы определить, как обрабатывать маршаллинг для поля.