簡體   English   中英

如何將由String和Seq [String]值組成的Scala Map轉換為JSON?

[英]How do I convert a Scala Map consisting of String and Seq[String] values to JSON?

在使用Scala的Play Framework中,如何將String和Seq [String]值的映射轉換為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.

如錯誤所述,您將需要為Map[String,Object]實現Writes

這就是它的樣子。 我已經編譯了這段代碼,看起來不錯。 (我假設您正在使用Play框架)。 僅供參考:案例只是作為起點。 您可以根據需要在其中添加/修改更多case

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: _*)

}
}

您可以簡單地做到這一點:

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

將導致以下結果:

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

您不能將地圖更改為

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM