【问题标题】:Play2 Scala - Json format with circular dependencyPlay2 Scala - 具有循环依赖的 Json 格式
【发布时间】:2016-05-03 03:03:20
【问题描述】:

我有两个类,每个类都包含另一个:

import play.api.libs.json.Json

case class Param(name: String,
                 data: ParamData)
case class ParamData(`type`: String,
                     value: String,
                     options: Option[List[Param]])

implicit val paramDataJsonFormat = Json.format[ParamData]
implicit val paramJsonFormat = Json.format[Param]

当我定义 Json 格式时出现编译错误:

错误:(110, 51) 没有可用的 List[Param]] 的隐式格式。

隐式val paramJsonFormat = Json.format[Param]

如果我改变隐含的顺序,我会在另一行得到同样的错误:

错误:(110, 51) 没有可用的 List[ParamData]] 的隐式格式。

隐式 val paramDataJsonFormat = Json.format[ParamData]

我该如何解决这个问题?

【问题讨论】:

  • 你将如何实例化这些类之一?我看到的唯一方法是在两者之一中添加null 或在ParamData 中添加一个空列表。
  • @EndeNeu 你是对的。 ParamDataoptions 成员是可选的。我将编辑问题。谢谢
  • 这并没有改变我的暗示,通常当我最终得到循环引用时,这是因为我的设计存在缺陷,在你的情况下,即使你使用选项,你仍然可以拥有None 或带有空列表的 Some,正如您所看到的那样有很大的不同。
  • 假设你必须用一个对象来建模一个菜单项。菜单项具有名称和(可选)一系列子项。您将如何对其建模以避免循环引用?
  • 我承认我从未遇到过这种情况,但这是有道理的。然后您需要编写自己的格式(new Format[Param] {...} ),并手动处理存在NoneSome 以及空和非空列表的情况。你不能为此使用宏扩展。

标签: json scala playframework


【解决方案1】:

Play official documentation 中找到了解决方案。有一个关于我缺少的递归类型的特定部分。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多