12

次の設定のケース クラスがあるとします。

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

しかし、ケース クラスが最終的により多くのフィールドを持つと仮定すると、AST を使用してオブジェクトの構造全体を列挙し、プリミティブをエンコードするためだけに非常に冗長なものを作成する可能性があります。

json4s には、特定のフィールドにのみ作用するフィールド シリアライザーが含まれているようで、名前を簡単に変換してフィールドを破棄するボイラープレート メソッドが含まれています。serializeただし、これらには、その機能とdeserialize部分機能に対して次のシグネチャがあります。

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

(キーを表す型 -> jsonからJFieldの val) は独自の型であり、のサブクラスではないため、これら 2 つのタイプのシリアライザーを組み合わせて、デフォルトの処理を維持しながら、キーをその名前で aJValueに適切にエンコードするにはどうすればよいですか?他のフィールド (プリミティブ データ型) のidUUID

基本的に、すでに処理できるPlaceすべてのフィールドに対して AST 構造を指定する必要なく、その中のフィールドが UUID であることを理解するフォーマット チェーンが必要です。DefaultFormats

私が具体的に探しているのは、キー名と値の型を使用してフィールドのマーシャリングを処理する方法を決定できるpythonのJSONEncoderandインターフェイスに似たパターンを模倣することです。JSONDecoder

4

2 に答える 2