鉴于以下情况Enumeration
...
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)
最后一条语句无法编译,因为编译器找不到类型的 Json 序列化器scala.collection.immutable.Map[MyEnum.Value,String]
.
问题:由于 Play 确实提供了类型的序列化器scala.collection.immutable.Map[String,String]
,并且我的枚举实际上包含字符串,有没有办法重用默认的 JSON 序列化器?
内置的Reads objects https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads%24不要定义一个Reads
for a Map
这是键中的参数。你可以这样做:
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)
}
根据您的上述价值观,您将获得:
scala> Json.toJson(m)(looserMapWrites)
res1: play.api.libs.json.JsValue = {"val1":"one","val2":"two","val3":"three"}
如果您愿意,您可以收紧这些限制A
使其不适用于任何AnyRef
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)