为Json4s编写自定义序列化程序

时间:2013-04-24 11:32:47

标签: json scala

由于Json4s仅在键是字符串时才附带Map序列化,因此我尝试使用Java枚举作为键来编写特定Map的自定义序列化器。

class HistoricalRecordCustomSerializer extends CustomSerializer[Map[QuotedData,Double]](
  format => (
    {
      case JArray(items) =>
        items.map{
                   case JObject(JField(name,JDouble(value))::Nil) => (QuotedData.valueOf(name),value)

                 }.toMap


    },
    {
      case x: Map[QuotedData,Double] =>
        JArray(
          x.map(entry =>
                  JObject(
                    List(
                      JField(entry._1.toString,JDouble(entry._2))
                    )
                  )
        ).toList
        )
} ) )

首先,这种实现在序列化的情况下显然不起作用,因为x: Map[QuotedData,Double]被删除了。另外,我无法让json4s使用它。 编写此自定义序列化程序的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

Json4s在这个阶段只知道字符串键,所以你想要实现的不适用于地图。

答案 1 :(得分:1)

您可以使用自定义密钥序列化程序

例如

    class UUIDKeyJSonSerializer extends CustomKeySerializer[UUID](format => ( {
  case s: String => {
    UUID.fromString(s)
  }
}, {
  case x: UUID => {
    x.toString
  }
}
  ))

您需要将对象映射到String,反之亦然

相关问题