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

2024-01-20

也许我发现了一个bug http://goo.gl/C79j8在 Spray-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)

所以我尝试自己修复它,但我对 Scala 的了解还不够强。 NPE 发生here https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/package.scala#L39当它试图转换内部时TestItem。功能参数write那一刻是null.

你能向我解释一下为什么它不使用我的隐式吗?我在调试器中看到,而不是使用我的隐式write包含一些魔法领域的值evidence$x$y它随着它的变化而变化深入调用链 http://snag.gy/xOSSs.jpg。我不知道那是什么。我觉得这与上下文有关,但阅读相关章节 https://rads.stackoverflow.com/amzn/click/com/0981531644没有帮助。


嗯,我应该更细心一些。我不得不使用lazyFormat包装纸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在“GROUP BY”子句中重用选择表达式的结果?

    在 MySQL 中 我可以有这样的查询 select cast from unixtime t time Y m d H 00 as datetime as timeHour from some table t group by timeH
  • 这是一种在 Akka FSM 中内部监视到第一个状态的转换的方法吗?

    考虑从状态 Idle 开始的 FSM actor startWith Idle IdleData 我想监视到第一个状态的转换 从无状态 I tried onTransition case gt Idle gt Wasn t called 根
  • 视图和流有什么区别?

    在Scala 2 8集合框架中 有什么区别view and toStream 在视图中 每次访问元素时都会重新计算它们 在流中 元素在求值时会被保留 例如 val doubled List 1 2 3 4 5 6 7 8 9 10 view
  • 隐式类中的 Scala 按名称调用构造函数参数

    下面的代码不编译 期望的是在隐式类中有一个按名称调用构造函数参数 如下所示 def f n Int 1 to n product implicit class RichElapsed A val f gt A extends AnyVal
  • 如何在 Scala mutable.Seq 上追加或前置

    Scala 有一些我不明白的地方collection mutable Seq http www scala lang org api current index html scala collection mutable Seq 它描述了所
  • 在 Scala 中创建 Java 对象

    我有一个 Java 类 Listings 我在 Java MapReduce 作业中使用它 如下所示 public void map Object key Text value Context context throws IOExcept
  • Scala 宏 - 使用“c.prefix”推断隐式值

    c inferImplicitValue推断调用站点范围中的隐式值 是否可以使用推断隐式c prefix scope 这不是有效的代码 但表达了我需要的内容 c prefix inferImplicitValue 我目前正在使用一个简单的实
  • 将类型信息传递给 Scala 中的函数

    我有对 json 对象执行一些常见操作的代码 即提取 所以我想创建一个通用函数 它接受哪个类的类型参数 代码如下所示 def getMessageType T json JValue Either GenericError T try Ri
  • 如何在平面级别将 JsValue 合并到 JsObject

    我有两个从案例类创建的 JsValue 即书籍和书籍详细信息 val bookJson Json tojson Book val bookDetailJson Json tojson BookDetail 格式为 Book id 1 nam
  • scala 中的抽象类型

    我正在经历抽象类型Scala我收到一个错误 我正在尝试的例子 scala gt class Food abstract class Animal type SuitableFood lt Food def eat food Suitable
  • 为什么类型级计算需要 Aux 技术?

    我很确定我在这里遗漏了一些东西 因为我对 Shapeless 还很陌生并且我正在学习 但是 Aux 技术实际上是什么时候required 我看到它是用来暴露type通过将其提升为另一个 同伴 的签名来声明type定义 trait F A t
  • e:B, f:(B,A)=>B) : B 是什么意思

    我对这意味着什么感到困惑 我理解柯里化 但我似乎无法完全阅读代码 def foldLeft A B xs List A e B f B A gt B B 只是几个建议 顺便说一句 里面没有柯里化 def foldLeft A B xs Li
  • Scala Monad - 完整的示例[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何更改 SBT 命令内的设置?

    我想要一个命令publish snapshot这将运行publish修改后的任务version设置 该设置将在执行命令时计算 我想出了如何获取当前值version内部命令 以及Project runTask task scope 似乎是调用
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • Scala中如何将DataFrame转换为RDD?

    有人可以分享一下如何转换dataframe to an RDD Simply val rows RDD Row df rdd
  • Spark - Scala - 用另一个数据帧中的查找值替换数据帧中的值

    我正在 Databricks 上使用 Spark 编程语言是Scala 我有两个数据框 主要数据框 见截图 1 https i stack imgur com EShir png 查找数据框 见截图3 https i stack imgur
  • scala.collection.breakOut 与视图

    这个答案 https stackoverflow com a 1716558 936869描述如何scala collection breakOut可用于防止创建浪费的中间集合 例如 这里我们创建一个中间体Seq String String
  • Spark:用列的平均值替换数据框中的空值

    如何创建 UDF 以编程方式将每列中 Spark 数据框中的空值替换为列平均值 例如 在示例中 数据 col1 空值的值为 2 4 6 8 5 5 5 示例数据 col1 col2 col3 2 null 3 4 3 3 6 5 null
  • Scala 组合器解析器 - 区分数字字符串和变量字符串

    我正在做 Cay Horstmann 的组合器解析器练习 我想知道区分代表数字的字符串和代表匹配语句中变量的字符串的最佳方法 def factor Parser ExprTree wholeNumber expr ident case a

随机推荐

  • opencv函数中的内存泄漏

    我注意到我的程序的内存使用量有时会毫无意义地增加 特别是当我使用cvWaitKey 0 我的程序倾向于在 10 秒内将内存使用情况拍摄到一个巨大的大小 有解决办法吗 或者这是一个 OpenCv 错误 我有一个简单的函数叫做Show Imag
  • 数据集设计器问题 - Visual Studio 2008

    我们使用数据集在应用程序中的各个节点之间传递少量数据 数据集本身位于程序集中 因为它是许多其他组件的引用 Visual Studio 数据集工具养成了一个奇怪的习惯 即每次构建完成后都会创建一个新的设计器 所以 该项目看起来像这样 MyDa
  • Graphql 只查询非空对象

    我正在尝试执行这样的查询 people pet name result people pet null people pet name steve 我想要的是只得到包含宠物的人 有什么方法可以实现这一点而不是在我的解析器上编码 事实上 这是
  • Linux 内核模块 - 创建 proc 文件 - proc_root 未声明错误

    我从该 URL 复制并粘贴代码 以使用内核模块创建和读取 写入 proc 文件 但收到 proc root 未声明的错误 这个例子在几个网站上都有 所以我认为它是有效的 有什么想法为什么我会收到此错误吗 我的 makefile 需要不同的东
  • 如何在虚拟模式下自动调整列表视图的列宽?

    当我使用 TListView ViewStyle vsReport 时 我可以自动调整列的宽度 设置LVSCW AUTOSIZE or LVSCW AUTOSIZE USEHEADER http msdn microsoft com en
  • 当某些列有多个分隔符时,将 pandas 数据框从宽转换为长

    From 将 pandas 数据框从宽转换为长 https stackoverflow com questions 45123924 convert pandas dataframe from wide to long 45124130 4
  • 类型错误:Object(...) 不是第一个运行 webpack 的函数

    我尝试基于 webpack 运行我的应用程序 但在第一次运行期间出现错误 Uncaught TypeError Object is not a function at Object
  • 使用 KnpPaginatorBundle 对连接表进行排序

    我设置了一个测试来更加熟悉 Symfony2 和 KnpPaginatorBundle 我有一张包含宠物的桌子 其中引用了宠物动物类型 Dog Cat ETC 我可以按id name 但是当我尝试按动物排序时type我收到一条错误消息 指出
  • 将 Google 文档集成到网站中以进行内容创建

    我正在建立一个自助出版网站 我想将 Google 文档集成到我的网站中 并允许每个出版商 作家从我的网站编写她 他的书 然后从我的网站或直接从 Google 文档更新内容 并保持两个版本的内容同步 这可能吗 谢谢 是的 这是可能的 您可以获
  • .net 4 向后兼容性

    在 net 4 中开发的 Windows 应用程序引用在 net 3 5 中开发的程序集 是否需要安装 net 4 和 net 3 5 才能运行该应用程序 我怀疑是这样 正如我的观察之一 此外 这感觉很合乎逻辑 因为两者的执行都需要不同的运
  • 使用 Kerberos 对 Windows 进行 Ansible 不起作用

    我尝试使用 Ansible 1 9 0 1 使用域用户名配置 Windows 服务器 我已经成功设置了 Linux Ansible 控制盒 并且能够使用基本身份验证来运行 ansible ansible playbook play 但是 使
  • 如何从剪贴板中清除指定格式的数据?

    我将一些数据放入剪贴板 从剪贴板复制数据后 我想清除数据而不清除整个剪贴板 像这样的东西 wchar t buf NULL if OpenClipboard NULL 0 HANDLE hData GetClipboardData CF U
  • 如何在以 struct 作为参数的 Ruby FFI 方法中包装函数?

    我正在尝试使用 ruby ffi 从共享对象调用函数 我将以下内容编译成共享对象 include
  • Laravel 的数据表服务器端 php 类

    我希望我的数据表在服务器端处理数据 我引用了这个示例 服务器端示例 http www datatables net examples data sources server side html 然而 本例中给出的服务器端 php 类 ssp
  • Internet Explorer 10 后退按钮缓存

    在 Internet Explorer 10 中 如果您按后退按钮 它会尝试从浏览器缓存中获取上一页 此行为与几乎所有其他浏览器 包括 IE9 不同 在 IE9 中 按后退按钮将完全重新加载上一页 而不是重用缓存 我如何从网站与 IE10
  • 错误 22 无法从程序集中加载“EnsureBindingRedirects”任务

    我使用 vs 2013 克隆了一个项目 当我运行它时 我收到此错误 Error 1 The EnsureBindingRedirects task could not be loaded from the assembly D BMaste
  • dplyr 输出类 data.frame

    我可以总结一个数据框dplyr像这样 mtcars gt group by cyl gt summarise mean mpg 将输出转换回类data frame 我目前的做法是这样的 as data frame mtcars gt gro
  • 如何使用 --set 来设置 Prometheus 图表的值?

    例如 设置alertmanager ingress annotations要添加两个项目 这两种方法都不起作用 helm install stable prometheus set alertmanager ingress enabled
  • AES CBC 加密/解密仅解密前 16 个字节

    我正在使用 AES CBC 和 openssl 进行一些工作 目前 我遇到了一个问题 我无法猜测出什么问题 一如既往 如果消息长度小于 16 字节 则加密和解密过程可以正常工作 但当消息大于 16 字节时 解密仅对第 16 个字节有效 当我
  • 由于递归隐式,spray-json 中的 NPE(上下文绑定问题?)

    也许我发现了一个bug http goo gl C79j8在 Spray json 中 当我尝试获取具有自身类型字段的对象的 json 时 出现空指针异常 例子是 case class TestItem subitems Option Li