次の設定のケース クラスがあるとします。
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
に適切にエンコードするにはどうすればよいですか?他のフィールド (プリミティブ データ型) のid
UUID
基本的に、すでに処理できるPlace
すべてのフィールドに対して AST 構造を指定する必要なく、その中のフィールドが UUID であることを理解するフォーマット チェーンが必要です。DefaultFormats
私が具体的に探しているのは、キー名と値の型を使用してフィールドのマーシャリングを処理する方法を決定できるpythonのJSONEncoder
andインターフェイスに似たパターンを模倣することです。JSONDecoder