作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定以下枚举
...
object MyEnum extends Enumeration {
type MyEnum = Value
val Val1 = Value("val1")
val Val2 = Value("val2")
val Val3 = Value("val3")
}
import MyEnum._
...和下面的 map
...
val m = Map(
val1 -> "one",
val2 -> "two",
val3 -> "three"
)
...我需要将 m
转换为 JSON:
import play.api.libs.json._
val js = Json.toJson(m)
最后一条语句无法编译,因为编译器没有找到 scala.collection.immutable.Map[MyEnum.Value,String]
类型的 Json 序列化程序。
问题:由于 Play 确实为 scala.collection.immutable.Map[String,String]
类型提供了序列化器,而我的枚举实际上包含字符串,有没有办法重用默认的 JSON 序列化器?
最佳答案
The built-in Reads
objects不要为键中参数化的 Map
定义 Reads
。你可以这样做:
implicit def looserMapWrites[A <: AnyRef, B : Writes]: Writes[Map[A, B]] = Writes { o =>
Json.toJson(o.map { case (key, value) =>
key.toString -> value
})(Writes.mapWrites)
}
根据您的上述值(value)观,您将获得:
scala> Json.toJson(m)(looserMapWrites)
res1: play.api.libs.json.JsValue = {"val1":"one","val2":"two","val3":"three"}
如果你愿意,你可以收紧 A
的边界,使其不适用于任何 AnyRef
。
关于scala - 如何将 Map[CustomType, String] 序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897921/
我是一名优秀的程序员,十分优秀!