我想用Scala播放将Seq[(String, String)]
转换为JSON,但我遇到了这个错误:
找不到类型为Seq [(String,String)]的Json序列化程序。尝试为此类型实现隐式写入或格式。
我该如何解决这个问题?
答案 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)))
}
如果将其放在包对象中,整个包都可以看到它。这是在许多类(即整个应用程序)中获得一致行为的好方法。