【问题标题】:Play Json serialize/deserialize mutual recursive玩Json序列化/反序列化相互递归
【发布时间】:2019-03-20 07:11:39
【问题描述】:

如何使用 Play Json 组合器对这些结构进行序列化和反序列化?

final case class WriteGroupEntity(label: String, items: Map[String, WriteEntity])
final case class WriteEntity(label: String,
                             propertyType: String,
                             groups: Option[Map[String, WriteGroupEntity]])

【问题讨论】:

  • @ChaitanyaWaikar,我还没有找到这个。 3岁了,所以没有食谱:(
  • 自己之前已经尝试过什么?
  • @cchantep,我只能手动编写 ser/deser

标签: scala play-json


【解决方案1】:

两天过去了,我终于找到了解决办法。

import play.api.libs.json._
import play.api.libs.functional.syntax._

final case class GroupEntity(label: String, items: Map[String, Entity])
final case class Entity(label: String,
                        propertyType: String,
                        groups: Option[Map[String, GroupEntity]])

implicit lazy val ge: OWrites[GroupEntity] = (
  (JsPath \ "label").write[String] and
    (JsPath \ "items").lazyWrite(Writes.map[Entity](e))
)(unlift(GroupEntity.unapply))

implicit val e: OWrites[Entity] = Json.writes[Entity]

implicit lazy val ger: Reads[GroupEntity] = (
  (JsPath \ "label").read[String] and
    (JsPath \ "items").lazyRead(Reads.map[Entity](er))
)(GroupEntity)

implicit val er = Json.reads[Entity]

【讨论】:

  • 这很好,但我在开发中这并不安全。在ReadingWriting 时,您无法追踪错误。
  • 只是一个建议,您需要创建自己的reads and writes 以进行更安全的验证。
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2020-10-23
  • 1970-01-01
  • 2016-04-03
相关资源
最近更新 更多