最简单的选择是将所有值转换为String
并保存。
val stringMap = testMap.mapValues(_.toString)
无法为AnyRef
创建自定义处理程序,或者从JObject
手动创建Map
并使用match
为每个选择特定的JSON类型元素。
,
Play-json尽可能地保持类型安全,这意味着它无法为// Start writing your ScalaFiddle code here
import play.api.libs.json._
val testMap = Map[String,Any](
"test" -> 1,"otherTest" -> "denada","mapsAlsoWorksSomehow" -> Map (
"wee" -> true,"mapsEverywhere" -> Map (
"wee" -> false,"prr" -> new java.util.Date(),),"ops" -> new java.lang.Integer(22)
)
)
//you can create your own function that just maps objects to JsValues without using types...
//not safe but works
def toJsValue(a:Any):JsValue = a match {
case v:JsValue => v
case v:Map[String,_] => JsObject(v.map { case (k,v) => (k,toJsValue(v)) }) //keep in mind we assume this is map of [String,Any] if not it will blow up :(
case v:String => JsString(v)
case v:Int => JsNumber(v)
case v:Boolean => JsBoolean(v)
case v:java.util.Date => JsString(v.toString)
case v if v == null => JsNull
}
implicit lazy val anyWriter:Writes[Map[String,Any]] = new Writes[Map[String,Any]] {
def writes(a:Map[String,Any]):JsValue = toJsValue(a)
}
println(Json.toJson(testMap))
println(toJsValue(testMap))
//here we use anyWriter implicitly but there is other one... currently shadowed :(.
println(Json.toJson(testMap.mapValues[JsValue] { case (v) => toJsValue(v) }))
提供隐式序列化程序。它可能会掩盖其他串行器,并且不能确保它不会失败。您可以创建自己的应用程序,但是将对其进行硬编码,并且不应将其放在全局变量中:
toJsValue
但是请记住,当您在Map中使用不受支持的类型时,它会爆炸。我猜最好的方法不是创建隐式编写器,而是在映射的参数上使用println
方法,然后尝试对其进行序列化(就像在最后的{{1}}中一样)。
demo
如果有帮助,请投票并标记为答案。
,
你不能那样做。
与AnyRef
最接近的事物是play.api.libs.json.JsValue
。
或者换句话说,您需要一个类似JSON
的对象结构,其中有 Writers 。 读者。
如果您需要进一步的说明,请告诉我。
本文链接:https://www.f2er.com/2826491.html