【问题标题】:Scala: How serialize data in JSON?Scala:如何在 JSON 中序列化数据?
【发布时间】:2020-02-20 09:08:50
【问题描述】:

我最近开始学习 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))
      )
    ))   )

【问题讨论】:

标签: json scala serialization json-serialization


【解决方案1】:

使用圆:

  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

【讨论】:

    【解决方案2】:

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

    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
    }
    

    case classobject必须放在同一个文件中。

    然后,当你需要使用它时,导入play.api.libs.json._

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

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

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

    {
       "id": 100
    }
    

    【讨论】:

    • 请举个例子
    猜你喜欢
    • 2011-09-10
    • 2019-01-01
    • 2016-10-30
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-09-17
    • 2013-08-17
    相关资源
    最近更新 更多