如何将地图转换为类型为AnyRef的json

我有一个[String,AnyRef]类型的Map。我如何使用play-json将其转换为Json。我找到了一些答案,但是都定义了类型。当我尝试转换时,得到的编译器错误消息为:

无类型的隐式参数:Writes [Map [String,AnyRef]]

val testMap: Map[String,AnyRef] = Map.empty[String,AnyRef]

假设此地图包含以下数据:

{ "lastModifiedTime" -> 1575311400000,"user_id" -> 1,"user_email" -> "user@email.com","is_active" -> true,"project_id" -> 1,"status"-> "COMPLETED" }

所以我的问题是,如果我将AnyRef作为map中的第二种类型,我如何仅使用play-Json将其转换为Json?

更正=>
这张地图是根据弹性搜索结果获得的,因此我无法保证每次地图都会相同,但是它将具有相同的类型,即Map [String,AnyRef]。

pacheco 回答:如何将地图转换为类型为AnyRef的json

最简单的选择是将所有值转换为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

大家都在问