json在play框架中反序列化ListBuffer [(String,String)]

时间:2013-12-25 05:28:26

标签: json scala playframework playframework-2.1 playframework-2.2

我正在使用scala中的play框架开发app我希望在json中响应但是如何编译时编译错误即将到来

 No Json deserializer found for type List[(String, String)]. Try to implement an implicit Writes or Format for this type.

列表缓冲区是

ListBuffer((This,a choke), (a Cv,15.6 gal))

我也做了这个

Json.toJson(list))

但仍然出现错误。

任何人都有一些想法来解决这个问题。

3 个答案:

答案 0 :(得分:3)

您期望它是(String, String)的json表示形式? 如果它是这样的:

yourListName : {
  "1" : "2",
  "3" : "4"
}

那么你可以使用Json.toJson(list.toMap)。否则,您必须为Writes定义(String, String),如下所示:

implicit val writer = new Writes[(String, String)] {
    def writes(c: (String, String)): JsValue = {
      Json.obj("something" -> c._1 + ", " + c._2)
      //or like this:
      //Json.obj(c._1 -> c._2)
    }
  }

请确保此作者在范围

答案 1 :(得分:0)

正如在这篇帖​​子[2.1] Json.format macros and Tuple2中讨论的那样,play-json 2.1不支持元组,主要是因为json不支持元组。如果您希望将元组作为数组写入,则可以使用元组的隐式格式:

implicit def tuple2Writes[A, B](implicit aWrites: Writes[A], bWrites: Writes[B]): Writes[Tuple2[A, B]] = new Writes[Tuple2[A, B]] {
  def writes(tuple: Tuple2[A, B]) = JsArray(Seq(aWrites.writes(tuple._1), bWrites.writes(tuple._2)))
}

答案 2 :(得分:0)

您可以在一行中执行此操作,只需声明此隐式:

implicit def tuple2[A : Writes, B : Writes] = Writes[(A, B)] ( t =>  Json.obj("something1" -> t._1, "something1" -> t._2) )