json - Scala:如何在 JSON 中序列化数据?
问题描述
我最近开始学习 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))
)
)) )
解决方案
您需要为您的案例类创建一个伴随对象:
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
}
推荐阅读
- .net-core - EF Core 2.0 For Self Referencing Table / Model
- scala - No TypeTag found in Scala Spark. Writing a method to get structype inside a trait
- java - 跨活动发送整数显示 0
- html - 结果
块被包装到下一行
- python - How to slice a 2d list into two separate lists in python?
- java - 如何根据自定义注解修改 RequestMapping 值
- php - php socket_recvfrom 随机失败
- python - 如何用 scipy.spatial.distance.cosine 计算加权相似度?
- git - SourceTree/raw Git 克隆错误,中断网络连接
- c++ - 从语言设计级别,当无法在编译时推断条件时,为什么“if constexpr”不会衰减为“trival if”