2013-05-08 22 views
3

也許我在spray-json中發現了bug。當我試圖獲取具有自己類型字段的對象的json時,我得到空指針異常。實例是:由於遞歸隱含(上下文綁定問題?),噴霧器json中的NPE

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我試圖修復它自己,但我斯卡拉的知識是不夠強大。當它試圖轉換內部TestItem時,NPE發生here。此時的功能參數writenull

您能否向我解釋爲什麼它不使用我的隱式呢?我在調試器中看到,不是使用我的隱式write包含一些魔術字段evidence$x$y的值,其變化爲goes deeper in calling chain。我不知道它是什麼。我覺得這是與上下文綁定有關的東西,但是閱讀relevant chapter沒有幫助。

回答

5

好吧,我應該更專注。我不得不使用lazyFormat包裝。