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