scala - 玩Json序列化/反序列化相互递归
问题描述
如何使用 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]])
解决方案
两天过去了,我终于找到了解决方案。
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]
推荐阅读
- javascript - 如何检查特定数组的值并增加或减少它?
- ios - 如何修复“数据(contentsOf:url)崩溃的应用程序”?
- python - 使用pandas concat合并两个数据框时如何删除重复项
- html - html5输入类型url验证中的模式
- sql - 有没有用 CTE 用 DELETE 雪花 SQL 语句查询的替代方法?
- node.js - Axios GET 请求不喜欢未定义的标头(x-auth-token)
- javascript - Javascript异步生成器改变产生值的类型?
- ios - 使用自定义单元格时影响 UITableViewCell 填充的较大文本
- android - 外部链接的Android Webview弹出窗口不起作用
- c# - 两个不同的实体引用同一个实体 Ef Core