Scala Json4s CustomKeySerializer

Я пытаюсь сделать все ключи в объекте json, отформатированном в PascalCase, при сериализации файла case class. Похоже, правильный способ сделать это - определить CustomKeySerializer из пакета org.json4s и переформатировать ключи, как я хочу. Однако, хотя я могу заставить CustomSerializer работать, я не могу заставить CustomKeySerializer фактически использоваться при сериализации класса case (с вложенными классами case неизвестных типов). Мой код выглядит следующим образом:

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

Что мне здесь не хватает?


person jdrub    schedule 26.10.2017    source источник


Ответы (1)


Похоже, вам придется использовать CustomSerializer. Если вы посмотрите на исходный код Extraction.scala по адресу internalDecomposeWithBuilder вы можете заметить фрагмент кода, который выглядит примерно так:

    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 только для добавления некоторого поведения для типов ключей, не определенных явно в этом сопоставлении с образцом.

person SergGr    schedule 26.10.2017