【问题标题】:How to implement a CustomKeySerializer如何实现 CustomKeySerializer
【发布时间】:2020-11-20 12:42:58
【问题描述】:

如果我尝试序列化案例类:

case class C(map: Map[Boolean, String])

我得到了例外:

org.json4s.package$MappingException: Do not know how to serialize key of type class java.lang.Boolean. Consider implementing a CustomKeySerializer

我在任何地方都找不到任何关于我应该如何实现 CustomKeySerializer 的文档。有人可以指点我吗?

【问题讨论】:

  • 我认为与问题相同的原因stackoverflow.com/questions/64914995/cannot-deserialize-a-tuple/…boolean 不能是 JSON 对象中的键,但在序列化 C 中它将是键:{ "map" : { true : "some_string", false : "antoher_one" } }但它是无效的。我建议不要使用 Boolean 作为序列化为 JSON 结构的键类型。
  • 错误信息具有误导性。您没有实现 CustomKeySerializer,您只需创建新实例并将其添加到您的格式中。检查其构造函数签名。
  • 你能创建minimal reproducible example吗?很难这样回答。

标签: scala json4s


【解决方案1】:

根据json standardkeys of an object must be stringsa String must be wrapped with quotes

如果你想转换支持的类型,你可以这样做:

case class C1(map: Map[String, Boolean]) {
  val json = "map" -> map
}
val c1 = C1(Map("true" -> true, "false" -> false))
println(pretty(render(c1.json)))

输出是:

{
  "map":{
    "true":true,
    "false":false
  }
}

但是如果你想转换一个不支持的类型,你需要自己进行转换。例如你可以这样做:

case class C(map: Map[Boolean, String]) {
  val json = "map" -> map.map(kvp => (kvp._1.toString, kvp._2))
}
val c = C(Map(true -> "true", false -> "false"))
println(pretty(render(c.json)))

输出是:

{
  "map":{
    "true":"true",
    "false":"false"
  }
}

为了完成您需要导入的所有操作:

import org.json4s.native.JsonMethods._
import org.json4s.JsonDSL._

代码在Scastie 运行。

【讨论】:

  • 您所写的关于键是字符串的内容 - 这正是需要键序列化程序的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2014-09-06
  • 2013-12-16
  • 2011-02-17
  • 2015-01-03
相关资源
最近更新 更多