如何使用喷雾对自定义对象进行 jsonize 处理?

Posted

技术标签:

【中文标题】如何使用喷雾对自定义对象进行 jsonize 处理?【英文标题】:how to jsonize a custom object with spray? 【发布时间】:2013-11-01 10:46:21 【问题描述】:

我正在尝试执行以下操作(我使用 spray-json_2.9.2 v1.2.3,因为我使用的是 scala 2.9.2)

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

case class TestMe(key: String, value: String)
object MyJsonProtocol extends DefaultJsonProtocol 
  implicit val prot = jsonFormat4(TestMe)

但我得到编译错误:

TestMe.type(带有底层类型对象 com...TestMe) [INFO] 必需:(?, ?, ?, ?) => ? [INFO] 注意:隐式值 prot 在这里不适用,因为它 出现在应用程序点之后,并且缺少明确的结果类型 [INFO] 隐式 val prot = jsonFormat4(TestMe)

我做错了什么我刚刚关注了文档:https://github.com/spray/spray-json#providing-jsonformats-for-case-classes

谢谢

【问题讨论】:

【参考方案1】:

如果您查看所有jsonFormat 签名,您会发现它需要一个函数,更准确地说是apply

case class TestMe(key: String, value: String)
object MyJsonProtocol extends DefaultJsonProtocol 
  implicit val prot = jsonFormat2(TestMe.apply)

AND jsonFormat不是宏函数,只是重载了,所以末尾的数字应该等于case类中args的个数

在此示例中,您的案例类有两个参数,因此您需要 jsonFormat2 而不是 jsonFormat4

并且最好将伴随对象 MyJsonProtocol 重命名为 TestMe,这将减少隐式的显式导入

【讨论】:

@AlexIv 为什么我们需要扩展 DefaultJsonProtocol ?如果没有该扩展名,它将正常工作: case class MyJsonProtocol(key: String, value: String) object MyJsonProtocol implicit val prot = jsonFormat2(MyJsonProtocol.apply) @igx 因为import DefaultJsonProtocol._ 而起作用,你看看这是一个扩展这个特征的伴生对象。如果您有此导入,则无需在您的应用程序中扩展它。在我的回答中,我只是复制粘贴了问题中的代码。

以上是关于如何使用喷雾对自定义对象进行 jsonize 处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用QSGGeometry对自定义QQuickItem进行抗锯齿处理

如何在喷雾中将所有拒绝转换为自定义 json?

在Objective-C中按一个属性对自定义对象的NSSet进行排序

使用内部对象的实例变量的值对自定义对象数组进行排序

按属性对自定义对象的 ArrayList 进行排序

是否可以根据这些对象的参数对自定义类对象列表进行子集化? (没有 LINQ)