Scala: Как сериализовать данные в JSON? - PullRequest
0 голосов
/ 20 февраля 2020

Я недавно начал учить Scala. Мне нужен простой способ сериализации моих данных в Json. Ниже я приведу пример данных. Я пробовал несколько популярных библиотек: GSON , Play JSON, Circe , но не получил результат! GSON не знает, как работать с Option (например, Option [String]), в Play JSON и Circe они должны описывать сериализацию и десериализацию абстрактного класса (я не знаю, как это обойти).

// Test data

  abstract class Base(id: Long, descr: Option[String])
  case class A(id: Long, descr: Option[String], a: Option[Long]) extends Base(id, descr)
  case class B(id: Long, descr: Option[String], b: Option[Double]) extends Base(id, descr)

  case class Data(id: Long, user: Option[String], data: Option[Array[Base]])

  val test: Array[Data] = Array(
    Data(1, Some("Qqq"), None),
    Data(2, None, None),
    Data(3, Some("Zzz"), Some(
      Array(
        A(1, Some("a1"), Some(111)),
        A(2, Some("a2"), None),
        A(3, None, Some(333)),
        B(4, Some("b1"), Some(444.444)),
        B(5, Some("b2"), None),
        B(6, None, Some(666.666))
      )
    ))   )

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Используя circe:

  import cats.syntax.functor._
  import io.circe.{Decoder, Encoder}, io.circe.generic.auto._
  import io.circe.syntax._

  implicit val encodeBase: Encoder[Base] = Encoder.instance {
    case foo @ A(_, _, _) => foo.asJson
    case bar @ B(_, _, _) => bar.asJson
  }

И тогда вы можете просто сделать

  test.asJson
1 голос
/ 20 февраля 2020

Вам необходимо создать сопутствующий объект для вашего класса дел, как:

object Data {
  import play.api.libs.json._
  implicit val read = Json.reads[Data]
  implicit val write = Json.writes[Data]
  implicit val dataFormat = Json.format[Data]

  def tupled = (Data.apply _).tupled
}

Оба класс дел и объект должен быть помещен в одно и то же файл.

Затем, когда вам нужно его использовать, импортируйте play.api.libs. json ._ :

   val myObject = new Data(100, None, None)
   val myJson = Json.toJson(myObject)

Obs: это библиотека Play Framework, если вы не используете этот fw, я не уверен, что вы можете использовать его.

Еще один obs ... когда вы конвертируете объект в json, все необязательные параметры, если Нет , не появятся в вашем json значении. Так, для моего примера, результат не будет содержать параметры пользователя и данных:

{
   "id": 100
}
...