Не найден сериализатор Json для типа Seq[(String, String)]. Попробуйте реализовать неявную запись или формат для этого типа
Я хочу преобразовать Seq[(String, String)]
в JSON с игрой Scala, но я сталкиваюсь с этой ошибкой:
Не найден сериализатор Json для типа Seq[(String, String)]. Попробуйте реализовать неявную запись или форматирование для этого типа.
Как я могу это исправить?
2 ответа
Это зависит от того, чего вы пытаетесь достичь. Скажи, что у тебя есть 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))
}
}
Если вы хотите сериализовать кортежи Scala в двухэлементные массивы JSON (это довольно часто), то вы можете написать неявный объект Writes для общего случая 2-кортежа (A, B). Это будет обрабатывать ваш случай (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)))
}
Если вы поместите это в объект пакета, он будет виден всему пакету. Это хороший способ получить согласованное поведение во многих классах (то есть во всем приложении).