由于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使用它。
编写此自定义序列化程序的正确方法是什么?
答案 0 :(得分:1)
Json4s在这个阶段只知道字符串键,所以你想要实现的不适用于地图。
答案 1 :(得分:1)
您可以使用自定义密钥序列化程序
例如
class UUIDKeyJSonSerializer extends CustomKeySerializer[UUID](format => ( {
case s: String => {
UUID.fromString(s)
}
}, {
case x: UUID => {
x.toString
}
}
))
您需要将对象映射到String,反之亦然