Kombinieren von Typ- und Feldserialisierern

Nehmen wir an, ich habe eine Fallklasse mit dem folgenden Setup:

case class Place(id:java.util.UUID, name:String)

Ich kann einen (funktionierenden!) Serializer für diesen Typ wie folgt schreiben:

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)
        }
        )
    )

Unter der Annahme, dass meine Fallklasse irgendwann viel mehr Felder hat, könnte dies dazu führen, dass ich die gesamte Struktur des Objekts mit dem AST aufzähle und etwas sehr Ausführliches erstelle, um nur Primitive zu codieren.

json4s verfügt anscheinend über Feldserialisierer, die nur auf bestimmte Felder angewendet werden können, einschließlich Boilerplate-Methoden, mit denen Namen einfach transformiert und Felder verworfen werden können. Diese haben jedoch die folgende Signatur für ihreserialize unddeserialize Teilfunktionen:

case class FieldSerializer[A: Manifest](
  serializer:   PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
  deserializer: PartialFunction[JField, JField] = Map()
)

Schon seitJField (der Typ, der einen Schlüssel darstellt -> Wert von json) ist ein eigener Typ und keine Unterklasse vonJValueWie kann ich diese beiden Arten von Serialisierern kombinieren, um dieid Schlüssel durch seinen Namen zu aUUID, während die Standardbehandlung der anderen Felder (die primitive Datentypen sind) beibehalten wird.

Im Grunde möchte ich eine Formatkette, die das Feld innerhalb verstehtPlace ist eine UUID, ohne dass die AST-Struktur für alle Felder angegeben werden muss, dieDefaultFormats kann schon damit umgehen.

Was ich speziell suche, ist, ein ähnliches Muster wie das zu imitierenJSONEncoder undJSONDecoder Schnittstellen in PythonHier können Sie anhand des Schlüsselnamens und des Wertetyps festlegen, wie das Marshalling für das Feld behandelt werden soll.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage