Scala 序列化一系列对象或任何对象
Scala Serializing a Seq of Objects or Any
我 运行 遇到序列化模型的问题:
我的模型:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
...
responsibleList: Option[Seq[UserModel]], // No problem
preConditions: Option[Seq[Object]], // Problem occurs here
postConditions: Option[Seq[Object]] // Problem occurs here
)
object DocumentModel {
implicit val documentFormat = Jsonx.formatCaseClass[DocumentModel]
}
responsibleList
、preConditions
和 postConditions
不存储在数据库中,它们仅用作辅助列表。我继续在我的控制器中填写这些列表,以便通过 JSON
:
将其发送回前端
val document = for {
newDocument <- documentDTO.getDocument(documentId, clientId)
responsibleList <- raciDocumentDTO.getResponsible_Documents(documentId)
...
preConditions <- conditionController.getPreConditions(documentId)
postConditions <- conditionController.getPostConditions(documentId)
} yield (newDocument, responsibleList, ..., preConditions, postConditions)
document.map({ case (newDocument, responsibleList, ..., preConditions, postConditions) =>
val temp = newDocument.map(docu => {
...
val doc = new DocumentModel(
docu.documentId,
docu.title,
...
Some(responsibleList),
Some(preConditions),
Some(postConditions)
)
doc
})
Ok(Json.obj(
"document" -> temp,
))
})
我怀疑这与 Option[Seq[Object]]
或 Option[Seq[Any]]
有关。编译器抛出错误:
由于 preConditions
和 postConditions
可以是来自各种 models
的 instances/objects
,我无法明确说明它应该是哪个模型。这个问题有解决办法还是我必须走另一条路?
提前致谢!
更新
我补充说:
trait Condition
object Condition {
import play.api.libs.json._
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq("DocumentModel" -> Jsonx(a)))
case b: ProcessModel => JsObject(Seq("ProcessModel" -> Jsonx(b)))
case c: ProcessInstanceModel => JsObject(Seq("ProcessInstanceModel" -> Jsonx(c)))
}
}
在我的模型中:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
...,
responsibleList: Option[Seq[UserModel]],
preConditions: Option[Seq[Condition]],
postConditions: Option[Seq[Condition]]
) extends Condition
它仍然给我留下这个错误信息:
这是我第一次 运行 遇到这样的问题,老实说我有点困惑。
更新 2
我已经像你说的那样试过了,但它仍然抛出同样的错误。
我的代码如下所示:
更新
我实施了建议的更改并将问题缩小为:
trait Condition
object Condition {
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq(
"documentId" -> Json.toJson(a.documentId),
"title" -> Json.toJson(a.title),
...
"responsibleList" -> Json.toJson(a.responsibleList),
"preConditions" -> Json.toJson(a.preConditions),
"postConditions" -> Json.toJson(a.postConditions)
))
case b: ...
}
}
当我这样做时,我收到以下错误消息:
所以我认为 implicit read
可能丢失了。所以我补充说:
object Condition {
implicit val conditionReads: OFormat[Condition] = Json.format[Condition] // New
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq(
"documentId" -> Json.toJson(a.documentId),
"title" -> Json.toJson(a.title),
...
然而,当 运行 我得到这个代码时:
No unapply or unapplySeq function found
[error] implicit val conditionReads: OFormat[Condition] = Json.format[Condition]
解决此问题的建议解决方案是将我的 object condition
更改为 case class condition
。但是,这会破坏创建此类通用 trait/object
的全部目的。
让你所有的 "condition" 模型扩展一个 JSON 可写的特征。例如,
trait Condition
object Condition {
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: PreConditionA => JsObject(Seq("field" -> JsString(a.stringValue))) //or whatever
case b: PreConditionB => //...
//etc...
case x: PostConditionX => //...
case y: PostConditionY => //...
//etc...
}
}
case class PreConditionA(stringValue: String) extends Condition
//etc.
然后在 DocumentModel
中,将条件的类型更改为 Condition
特征:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
//...
responsibleList: Option[Seq[UserModel]],
preConditions: Option[Seq[Condition]],
postConditions: Option[Seq[Condition]]
)
您可能需要将序列化语法转换为适用于 Jsonx 的任何语法,但希望它足够相似并且您明白了。
我 运行 遇到序列化模型的问题: 我的模型:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
...
responsibleList: Option[Seq[UserModel]], // No problem
preConditions: Option[Seq[Object]], // Problem occurs here
postConditions: Option[Seq[Object]] // Problem occurs here
)
object DocumentModel {
implicit val documentFormat = Jsonx.formatCaseClass[DocumentModel]
}
responsibleList
、preConditions
和 postConditions
不存储在数据库中,它们仅用作辅助列表。我继续在我的控制器中填写这些列表,以便通过 JSON
:
val document = for {
newDocument <- documentDTO.getDocument(documentId, clientId)
responsibleList <- raciDocumentDTO.getResponsible_Documents(documentId)
...
preConditions <- conditionController.getPreConditions(documentId)
postConditions <- conditionController.getPostConditions(documentId)
} yield (newDocument, responsibleList, ..., preConditions, postConditions)
document.map({ case (newDocument, responsibleList, ..., preConditions, postConditions) =>
val temp = newDocument.map(docu => {
...
val doc = new DocumentModel(
docu.documentId,
docu.title,
...
Some(responsibleList),
Some(preConditions),
Some(postConditions)
)
doc
})
Ok(Json.obj(
"document" -> temp,
))
})
我怀疑这与 Option[Seq[Object]]
或 Option[Seq[Any]]
有关。编译器抛出错误:
preConditions
和 postConditions
可以是来自各种 models
的 instances/objects
,我无法明确说明它应该是哪个模型。这个问题有解决办法还是我必须走另一条路?
提前致谢!
更新
我补充说:
trait Condition
object Condition {
import play.api.libs.json._
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq("DocumentModel" -> Jsonx(a)))
case b: ProcessModel => JsObject(Seq("ProcessModel" -> Jsonx(b)))
case c: ProcessInstanceModel => JsObject(Seq("ProcessInstanceModel" -> Jsonx(c)))
}
}
在我的模型中:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
...,
responsibleList: Option[Seq[UserModel]],
preConditions: Option[Seq[Condition]],
postConditions: Option[Seq[Condition]]
) extends Condition
它仍然给我留下这个错误信息:
这是我第一次 运行 遇到这样的问题,老实说我有点困惑。
更新 2
我已经像你说的那样试过了,但它仍然抛出同样的错误。
我的代码如下所示:
更新
我实施了建议的更改并将问题缩小为:
trait Condition
object Condition {
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq(
"documentId" -> Json.toJson(a.documentId),
"title" -> Json.toJson(a.title),
...
"responsibleList" -> Json.toJson(a.responsibleList),
"preConditions" -> Json.toJson(a.preConditions),
"postConditions" -> Json.toJson(a.postConditions)
))
case b: ...
}
}
当我这样做时,我收到以下错误消息:
implicit read
可能丢失了。所以我补充说:
object Condition {
implicit val conditionReads: OFormat[Condition] = Json.format[Condition] // New
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: DocumentModel => JsObject(Seq(
"documentId" -> Json.toJson(a.documentId),
"title" -> Json.toJson(a.title),
...
然而,当 运行 我得到这个代码时:
No unapply or unapplySeq function found
[error] implicit val conditionReads: OFormat[Condition] = Json.format[Condition]
解决此问题的建议解决方案是将我的 object condition
更改为 case class condition
。但是,这会破坏创建此类通用 trait/object
的全部目的。
让你所有的 "condition" 模型扩展一个 JSON 可写的特征。例如,
trait Condition
object Condition {
implicit val conditionWrites: Writes[Condition] = Writes[Condition] {
case a: PreConditionA => JsObject(Seq("field" -> JsString(a.stringValue))) //or whatever
case b: PreConditionB => //...
//etc...
case x: PostConditionX => //...
case y: PostConditionY => //...
//etc...
}
}
case class PreConditionA(stringValue: String) extends Condition
//etc.
然后在 DocumentModel
中,将条件的类型更改为 Condition
特征:
case class DocumentModel(
documentId: Option[Int] = None,
title: String,
//...
responsibleList: Option[Seq[UserModel]],
preConditions: Option[Seq[Condition]],
postConditions: Option[Seq[Condition]]
)
您可能需要将序列化语法转换为适用于 Jsonx 的任何语法,但希望它足够相似并且您明白了。