【问题标题】:Play Framework - Json.format case class conversion with a case classPlay Framework - 带案例类的Json.format案例类转换
【发布时间】:2018-11-09 11:00:40
【问题描述】:

我无法使以下工作,所以甚至不知道它是否可能:

case class ItemA(name:String,itemB:ItemB)
case class ItemB(name:String)

object ToJson{
   implicit val itemAJson = Json.format[ItemA]
   implicit val itemBJson = Json.format[ItemB]
}

我收到类似以下的编译错误:

ItemB 没有可用的隐式格式。 [错误] 隐式 val itemAJson = Json.format[ItemA]

很确定这是做不到的,但是有什么明智的方法可以采取吗?

播放框架 2.3

【问题讨论】:

  • 由于您的 ItemA 依赖于 ItemB 所以为了创建 json.Format[ItemA] 必须首先定义 json.Forma[ItemB] ,因此更改顺序首先定义 itemBJson 然后 itemAJson
  • 这修复了它。想要添加它作为答案,我可以确认?

标签: json scala playframework


【解决方案1】:

由于您的 ItemA 依赖于 ItemB 所以为了创建 json.Format[ItemA] 必须先定义 json.Forma[ItemB] ,因此更改顺序首先定义 itemBJson 然后 itemAJson

implicit val itemBJson = Json.format[ItemB]
implicit val itemAJson = Json.format[ItemA]

【讨论】:

    【解决方案2】:

    另一种选择是lazy隐式变量......这样它不会影响您编写它的顺序。我有很多 jsonFormat,它们都像这样正常工作:

    object ToJson {
       implicit lazy val itemAJson = Json.format[ItemA]
       implicit lazy val itemBJson = Json.format[ItemB]
    }
    

    Play documentation 中的解决方案与此类似。对于递归类型。

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2014-12-18
      相关资源
      最近更新 更多