【问题标题】:NPE in spray-json because of recursive implicits (context bound issue?)由于递归隐式,spray-json 中的 NPE(上下文绑定问题?)
【发布时间】:2013-05-08 22:08:06
【问题描述】:

也许我在 spray-json 中发现了一个 bug。当我尝试获取具有自身类型字段的对象的 json 时,我得到空指针异常。例子是:

case class TestItem(subitems: Option[List[TestItem]])

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val testItemFormat: RootJsonFormat[TestItem] = jsonFormat(TestItem, "subitems")
}

import MyJsonProtocol._

object TestNPE {
  def main(args: Array[String]) {

    val subitems = List(TestItem(None))
    val item: TestItem = TestItem(Option(subitems))
    val jsonAst = item.toJson
    val json = jsonAst.prettyPrint
    println(json)
  }
}

调用堆栈是这样的

Exception in thread "main" java.lang.NullPointerException
    at spray.json.PimpedAny.toJson(package.scala:40)
    at spray.json.CollectionFormats$$anon$1$$anonfun$write$1.apply(CollectionFormats.scala:26)
    at spray.json.CollectionFormats$$anon$1$$anonfun$write$1.apply(CollectionFormats.scala:26)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.immutable.List.foreach(List.scala:309)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.AbstractTraversable.map(Traversable.scala:105)
    at spray.json.CollectionFormats$$anon$1.write(CollectionFormats.scala:26)
    at spray.json.CollectionFormats$$anon$1.write(CollectionFormats.scala:25)
    at spray.json.PimpedAny.toJson(package.scala:40)
    at spray.json.StandardFormats$OptionFormat.write(StandardFormats.scala:34)
    at spray.json.StandardFormats$OptionFormat.write(StandardFormats.scala:32)
    at spray.json.ProductFormats$class.productElement2Field(ProductFormats.scala:473)
    at spray.json.MyJsonProtocol$.productElement2Field(TestNPE.scala:5)
    at spray.json.ProductFormats$$anon$1.write(ProductFormats.scala:32)
    at spray.json.ProductFormats$$anon$1.write(ProductFormats.scala:30)
    at spray.json.PimpedAny.toJson(package.scala:40)
    at spray.json.TestNPE$.main(TestNPE.scala:18)
    at spray.json.TestNPE.main(TestNPE.scala)

所以我尝试自己修复它,但我对 Scala 的了解还不够强。 NPE 在尝试转换内部TestItem 时发生here。此时函数参数writenull

你能解释一下为什么它不使用我的隐式代替吗?我在调试器中看到,而不是使用我的隐式write 包含一些魔术字段evidence$x$y 的值,它会随着goes deeper in calling chain 而变化。我不知道那是什么。我觉得这与上下文绑定有关,但阅读 relevant chapter 并没有帮助。

【问题讨论】:

    标签: scala implicit context-bound spray-json


    【解决方案1】:

    嗯,我应该更加专心。我不得不使用lazyFormat 包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2020-10-03
      • 2016-12-21
      • 2012-01-17
      • 2020-11-05
      相关资源
      最近更新 更多