找不到类型为Seq [(String,String)]的Json序列化程序。尝试为此类型实现隐式写入或格式

时间:2014-09-05 07:56:18

标签: json scala playframework-2.2

我想用Scala播放将Seq[(String, String)]转换为JSON,但我遇到了这个错误:

  

找不到类型为Seq [(String,String)]的Json序列化程序。尝试为此类型实现隐式写入或格式。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:11)

这取决于你想要实现的目标。假设你有Seq[(String, String)]这样:

val tuples = Seq(("z", "x"), ("v", "b"))

如果您尝试将其序列化如下:

{
  "z" : "x",
  "v" : "b"
}

然后只使用Json.toJson(tuples.toMap)。如果您想要对元组进行自定义表示,可以按照编译器的建议定义Writes

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

修改

import play.api.mvc._
import play.api.libs.json._

class MyController extends Controller {
  implicit val writer = new Writes[(String, String)] {
    def writes(t: (String, String)): JsValue = {
      Json.obj("something" -> t._1 + ", " + t._2)
    }
  }

  def myAction = Action { implicit request =>
    val tuples = Seq(("z", "x"), ("v", "b"))
    Ok(Json.toJson(tuples))
  }
}

答案 1 :(得分:2)

如果要将Scala元组序列化为2元素JSON数组(这很常见),那么您可以为2元组(A,B)的一般情况编写隐式Writes对象。这将处理(String,String)以及任何其他类型组合的情况!

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

如果将其放在包对象中,整个包都可以看到它。这是在许多类(即整个应用程序)中获得一致行为的好方法。