1

由于 Json4s 仅在键是字符串时才带有 Map 序列化,因此我正在尝试为特定 Map 编写自定义序列化程序,并将 Java 枚举作为键。

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 使用它。编写此自定义序列化程序的正确方法是什么?

4

2 回答 2

1

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

于 2013-04-30T00:30:55.667 回答
1

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

例如

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

您需要将对象映射到字符串,反之亦然

于 2016-02-19T13:42:12.960 回答