首页 > 解决方案 > Scala:如何在 JSON 中序列化数据?

问题描述

我最近开始学习 Scala。我需要一种简单的方法来在 Json 中序列化我的数据。下面我举一个数据的例子。我尝试了几个流行的库:GSONPlay JSONCirce,但没​​有得到结果!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))
      )
    ))   )

标签: jsonscalaserializationjson-serialization

解决方案


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

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框架库,如果你不使用这个fw,我不确定你是否可以使用它。

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

{
   "id": 100
}

推荐阅读