如何使用喷雾对自定义对象进行 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进行抗锯齿处理