2017-10-26 10 views
1

case classをシリアル化するときに、PascalCaseでフォーマットされたjsonオブジェクトのすべてのキーを作成しようとしています。これを行う正しい方法は、org.json4sパッケージからCustomKeySerializerを定義し、私が望むようにキーを再フォーマットすることです。しかし、私はCustomSerializerを動作させることができますが、実際にCustomKeySerializerを取得することはできません。ケースクラスを(不明な型のネストされたケースクラスを使用して)直列化するときに実際に使用されます。私のコードは次のようになります:Scala Json4s CustomKeySerializer

case object PascalCaseSerializer extends CustomKeySerializer[String](format => (
    { case _ => "this is the deserializer and I don't need it" }, 
    { case _ => "this does nothing" } 
)) 
implicit val formats: Formats = DefaultFormats + PascalCaseSerializer 

case class Foo(thingId: Int, eventData: Any) 
case class Bar(numThings: Int) 
val event = Foo(1, Bar(2)) 

val payloadJson = write(event) // """{"thingId":1,"eventData":{"numThings":2}}""" 

私はここで何が欠けていますか?

答えて

0

CustomSerializerを使用する必要があるようです。それはあなたがStringキーのデフォルト動作をオーバーライドするCustomKeySerializer[String]を使用することができないことを意味

while(iter.hasNext) { 
     iter.next() match { 
     case (k: String, v) => addField(k, v, obj) 
     case (k: Symbol, v) => addField(k.name, v, obj) 

     ... 

     case (k, v) => { 
      val customKeySerializer = formats.customKeySerializer(formats) 
      if(customKeySerializer.isDefinedAt(k)) { 
      addField(customKeySerializer(k), v, obj) 
      } else { 
      fail("Do not know how to serialize key of type " + k.getClass + ". " + 
       "Consider implementing a CustomKeySerializer.") 
      } 
     } 
     } 
    } 

:あなたはinternalDecomposeWithBuilderでExtraction.scalaソースを見れば、あなたは次のようになり、コードの一部を気づくことがあります。 CustomKeySerializerのみを使用して、このパターンマッチングで明示的に定義されていないキータイプに対していくつかの動作を追加できます。

関連する問題