Scala:如何序列化 JSON 中的数据?

Scala: How serialize data in JSON?

我最近开始学习Scala。我需要一种简单的方法来序列化 Json 中的数据。下面我举个数据的例子。我尝试了几个流行的库:GSON, Play JSON, Circe,但没有得到结果! GSON 不知道如何使用 Option(例如 Option [String]),在 Play JSON 和 Circe 他们需要描述抽象 class 的序列化和反序列化(我不知道如何获得围绕这个)。

// 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))
      )
    ))   )

您需要为您的案例创建一个伴随对象 class 作为:

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
}

Both case class and object must be placed in same file.

然后,需要用到的时候,import play.api.libs.json._:

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

观察:这是一个Play框架库,如果你不使用这个fw,我不确定你是否可以使用它。

另一个obs ...当你将对象转换为json时,所有可选参数,如果是None,不会出现在您的 json 值中。因此,对于我的示例,结果将不包含用户和数据参数:

{
   "id": 100
}

使用圈子:

  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