使用喷雾 json 序列化 Map[String, Any]
Posted
技术标签:
【中文标题】使用喷雾 json 序列化 Map[String, Any]【英文标题】:Serialize Map[String, Any] with spray json 【发布时间】:2014-11-13 00:22:25 【问题描述】:如何使用 spray-json 序列化 Map[String, Any]?我试试
val data = Map("name" -> "John", "age" -> 42)
import spray.json._
import DefaultJsonProtocol._
data.toJson
上面写着Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,Any]
。
【问题讨论】:
【参考方案1】:另一个应该适用于您的情况的选项是
import spray.json._
import DefaultJsonProtocol._
data.parseJson.convertTo[Map[String, JsValue]]
【讨论】:
我喜欢你提到的这一点,因为在许多情况下,使用JsValue
作为值可能对人们来说已经足够了。这也更符合spray.json的心态,恕我直言,而不是处理Any的。
data
的类型为 Map[String,Any]
- 我应该导入什么使其具有 parseJson
方法?
我相信他的意思是data.toJson
@mirelon 可能是过时评论的一种方式 - 但对于其他阅读此内容的人:您应该确保 import spray.json._
和 import DefaultJsonProtocol._
花了一整天的时间在这上面。解决方案就像一个魅力。 ……终于到了睡觉的时间。非常感谢。【参考方案2】:
这是我用来执行此任务的隐式转换器:
implicit object AnyJsonFormat extends JsonFormat[Any]
def write(x: Any) = x match
case n: Int => JsNumber(n)
case s: String => JsString(s)
case b: Boolean if b == true => JsTrue
case b: Boolean if b == false => JsFalse
def read(value: JsValue) = value match
case JsNumber(n) => n.intValue()
case JsString(s) => s
case JsTrue => true
case JsFalse => false
改编自Spray用户组的this post,但我无法获取也不需要将嵌套的Sequence和Maps写入Json,所以我将它们取出。
【讨论】:
太棒了,它对我有用。我只需要确保在依赖它的其他 JsonFormat 隐式之前声明此对象 好用吗?我将此代码复制粘贴到我的 immutableMap.toJson 上方。但仍然出现“找不到 Json writer...”错误。 抱歉,成功了。看起来我仍然使用可变映射,并且它必须是不可变的才能使这个示例起作用。 谢谢。我认为你可以简单地使用'case true => JsTrue'和'case false => JsFalse'。更简单 - 没有功能变化。 我很好奇为什么它不是spray-json的一部分以上是关于使用喷雾 json 序列化 Map[String, Any]的主要内容,如果未能解决你的问题,请参考以下文章
golang json 序列化反序列化 字符串反序列化成 map[string]interface{}