Не найден сериализатор 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)))
}

Если вы поместите это в объект пакета, он будет виден всему пакету. Это хороший способ получить согласованное поведение во многих классах (то есть во всем приложении).

Другие вопросы по тегам