scala - 由于递归隐式(上下文绑定(bind)问题?),spray-json 中的 NPE

也许我发现了一个bug在喷雾 json 中。当我尝试获取具有自身类型字段的对象的 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)

Sooo 我尝试自己修复它,但我对 Scala 的了解还不够丰富。 NPE 发生 here当它试图转换内部 TestItem 时。此时函数参数writenull

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

最佳答案

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

https://stackoverflow.com/questions/16451042/

相关文章:

r - 为什么 na.omit 向空数据框添加一行?

sql-server - 在 edmx 中重命名列的最佳方法是什么?

javascript - 如何将事件监听器添加到对象数组

eclipse - 无法使用 sass-maven-plugin 编译 style.scss

cassandra - Cassandra 是否是一个很好的候选数据库,因为它必须每秒支持超过 10

ember.js - Emberjs 将对象添加到 ArrayController,服务器查询是不可

django - 如何修复 Django 错误 : "' unicode' object has n

r - 哪些参数被传递给回溯中的函数?

vbscript - 使用 VBScript 获取 Mac 地址

r - R中代数关系的笛卡尔积表