1

我试图在序列化case class. 看起来正确的方法是CustomKeySerializerorg.json4s包中定义 a 并按照我的意愿重新格式化键。但是,虽然我能够让 aCustomSerializer工作,但CustomKeySerializer在序列化案例类(具有未知类型的嵌套案例类)时,我无法真正使用 a。我的代码如下所示:

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

我在这里想念什么?

4

1 回答 1

0

看起来您将不得不使用CustomSerializer. 如果您查看internalDecomposeWithBuilder的 Extraction.scala 源代码,您可能会注意到一段代码如下所示:

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

这意味着您不能使用CustomKeySerializer[String]覆盖键的默认行为String。您只能使用CustomKeySerializer为未在此模式匹配中明确定义的键类型添加一些行为。

于 2017-10-26T23:08:25.657 回答