使用喷雾 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{}

转换地图 到JSON并返回Map

序列化

golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出

如何在 Scala 中将 Map 序列化为 JSON?

仅在喷雾 json 中具有案例对象自定义实现的特征