【问题标题】:How do I convert a Scala Map consisting of String and Seq[String] values to JSON?如何将包含 String 和 Seq[String] 值的 Scala Map 转换为 JSON?
【发布时间】:2014-06-06 19:20:44
【问题描述】:

在使用 Scala 的 Play Framework 中,如何将 String 和 Seq[String] 值的 Map 转换为 JSON 格式?以下代码对我产生了错误:

val objMap = Map("id" -> "id", "tags" -> Seq("tag1", "tag2"))
Json.toJson(objMap)

产生的错误:

No Json serializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.

【问题讨论】:

    标签: json scala playframework scala-2.10


    【解决方案1】:

    正如错误所说,您需要为Map[String,Object] 实现写入

    这就是它的样子。我已经编译了这段代码,它看起来很好。 (我假设您使用的是 Play 框架)。仅供参考:那里的案例仅作为起点。您可以根据您的要求在其中添加/修改更多cases。

    import play.api.libs.json._
    import play.api.libs.json.Writes
    import play.api.libs.json.Json.JsValueWrapper
    
    val objMap = scala.collection.immutable.Map("id" -> "id", "tags" -> Seq("tag1", "tag2"))
    Json.toJson(objMap)
    
    implicit val writeAnyMapFormat = new Writes[Map[String, Object]] {
    def writes(map: Map[String, Object]): JsValue = {
      Json.obj(map.map {
        case (s, a) => {
          val ret: (String, JsValueWrapper) = a match {
            case _: String => s -> JsString(a.asInstanceOf[String])
            case _: java.util.Date => s -> JsString(a.asInstanceOf[String])
            case _: Integer => s -> JsString(a.toString)
            case _: java.lang.Double => s -> JsString(a.toString)
            case None => s -> JsNull
            case JsArray(elements) => s -> JsArray(elements)
            case _ => s -> JsArray(a.asInstanceOf[List[Int]].map(JsNumber(_)))
          }
          ret
        }
      }.toSeq: _*)
    
    }
    }
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      val objMap = Map("id" -> Json.toJson("id"), "tags" -> Json.toJson(Seq("tag1", "tag2")))
      Json.toJson(objMap)
      

      将导致:

       {"id":"id","tags":["tag1","tag2"]}
      

      【讨论】:

        【解决方案3】:

        能不能把地图改成

        val objMap = Map("id" -> Seq("id"), "tags" -> Seq("tag1", "tag2"))
        

        您可以定义一个案例类和一个隐式写入,为案例类定义更容易

        case class Post(id: String, tags: Seq[String])
        
        implicit val postWrites = Json.writes[Post]
        
        val objMap = Seq(Post("id1", Seq("tag1", "tag2")))
        
        Json.toJson(objMap)
        

        【讨论】:

        • 你的第二个选择是我最终做的,一旦我了解它。这似乎是 Play 中惯用的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多