【问题标题】:spray-json recursive json issue - could not find implicit value for evidence parameterspray-json 递归 json 问题 - 找不到证据参数的隐式值
【发布时间】:2015-09-17 14:41:16
【问题描述】:

您好,我在使用带有递归数据结构的 spray-json 库解析 json 时有点挣扎。

我定义了以下案例类结构和协议

import spray.json.DefaultJsonProtocol
import spray.json._

case class OfferAnalysisReport(BUG: DleTN, DOM: DleTN) extends AnalyticalReport
case class DleTN(doc_count: Int, result: AggsDefinition)
case class BucketDefinition(key: String, doc_count: Int, result: Option[AggsDefinition])
case class AggsDefinition(buckets: List[BucketDefinition])

object OfferAnalysisReportProtocol extends DefaultJsonProtocol {
  implicit val aggsDefFormat = lazyFormat(jsonFormat(AggsDefinition,"buckets"))

  implicit val bucketDefinitionFormat = lazyFormat(jsonFormat(BucketDefinition,"key","doc_count","result"))

  implicit val dleTypNemovitostisFormat = jsonFormat2(DleTypuNemovitosti)

  implicit val OfferAnalysisReportFormat = jsonFormat2(OfferAnalysisReport)
}

在我正在导入的测试中:

import spray.json._
import OfferAnalysisReportProtocol._

但我还是得到了

Error: couldn't find implicit value for evidence parameter of type BuckedDefinition.

我在这里遗漏了什么重要的东西吗?有人可以给我一个提示吗?

【问题讨论】:

  • 你能尝试定义像implicit lazy val aggsDefFormatimplicit lazy val bucketDefinitionFormat这样的惰性变量吗?
  • 懒惰地定义变量没有帮助。

标签: json scala spray spray-json


【解决方案1】:

你必须像你做的那样用lazyFormat包装你的格式构造函数,但你还必须提供一个像这样的显式类型注释:

implicit val fooFormat: JsonFormat[Foo] = lazyFormat(jsonFormat(Foo, "i", "foo"))

来源:https://github.com/spray/spray-json#jsonformats-for-recursive-types

【讨论】:

  • 那是一个愚蠢的错误,我把那个文档弄红了,但是忽略了类型声明的必要性。谢谢你指出来!
【解决方案2】:

@spydons 解决方案对我不起作用。您也可以通过编写自定义序列化程序来处理递归类。下面是一个写作示例:

object Test extends App{

  import spray.json._

  case class Foo(i: Int, foo: Foo)

  implicit object FooJsonFormat extends RootJsonWriter[Foo] {
    override def write(c: Foo)  : JsValue =
      if (c.foo != null) { JsObject("i" -> JsNumber(c.i),"foo" -> write(c.foo)) }
      else { JsObject("i" -> JsNumber(c.i)) }
  }

  println(Foo(20,Foo(10,null)).toJson) //prints {"foo":{"i":10},"i":20}
}

【讨论】:

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