【问题标题】:how to jsonize a custom object with spray?如何使用喷雾对自定义对象进行 jsonize 处理?
【发布时间】: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

谢谢

【问题讨论】:

    标签: json scala spray


    【解决方案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._ 而起作用,你看看这是一个扩展这个特征的伴生对象。如果您有此导入,则无需在您的应用程序中扩展它。在我的回答中,我只是复制粘贴了问题中的代码。
    猜你喜欢
    • 2013-02-15
    • 2014-11-13
    • 2020-02-09
    • 1970-01-01
    • 2021-08-20
    • 2016-12-12
    • 2018-08-10
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多