Załóżmy, że mam klasy etui z następującej konfiguracji:Łączenie typu i terenowych serializers
case class Place(id:java.util.UUID, name:String)
mogę napisać (działa!) Serializatora dla tego typu w następujący sposób:
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)
}
)
)
Ale zakładając, że moja klasa przypadków ma w końcu znacznie więcej pól, może to doprowadzić do wyliczenia całej struktury obiektu za pomocą AST, tworząc coś, co jest bardzo szczegółowe, aby zakodować prymitywy.
json4s wydaje się mieć serializatory pola, które mogą działać tylko w określonych polach, z dołączonymi metodami, które pozwalają łatwo przekształcać nazwy i odrzucić pola. Te jednak mają następujący podpis dla swoich serialize
i deserialize
funkcja częściowa:
case class FieldSerializer[A: Manifest](
serializer: PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
deserializer: PartialFunction[JField, JField] = Map()
)
Rejestracja JField
(typ że representes klucz -> val z JSON) jest jego własny rodzaj i nie podklasą JValue
, jak połączyć te dwa typy serializerów, aby poprawnie zakodować klucz id
według nazwy na UUID
, zachowując domyślną obsługę pozostałych pól (które są typami pierwotnymi).
Zasadniczo chciałbym, aby łańcuch formatu rozumiał pole w zakresie Place
to UUID, bez konieczności określania struktury AST dla wszystkich pól, które można już obsłużyć w przypadku pól, które DefaultFormats
.
To, czego szukam, to naśladować wzór podobny do JSONEncoder
and JSONDecoder
interfaces in python, który może wykorzystywać nazwę klucza oraz typ wartości, aby określić, w jaki sposób obsłużyć układanie pola.
Downvotes bez komentarzy mnie smutno :( – DeaconDesperado
sprawdź również http://stackoverflow.com/questions/23977779/is-there-an-out-of-the-box-format-for-uuid-in-json4s dla specyficzny numer UUID – iwein