6

我发现自己处于需要将非案例类序列化为 JSON 的情况。

有一个类:

class MyClass(val name: String) {
  def SaySomething() : String = {
    return "Saying something... "
  }
}

我为这个类创建了一个 JsonProtocol:

object MyClassJsonProtocol extends DefaultJsonProtocol {

  implicit object MyClassJsonFormat extends JsonWriter[MyClass] {
  override def write(obj: MyClass): JsValue =
    JsObject(
      "name" -> JsString(obj.name)
    )
  }
}

稍后在代码中我导入协议..

val aListOfMyClasses = List[MyClass]() ... // lets assume that has items and not an empty list
import spray.json._
import MyClassJsonProtocol._

val json = aListOfMyClasses.toJson

尝试构建项目时出现以下错误:

找不到类型类 List[MyClass] 的 JsonWriter 或 JsonFormat

spray-json 已经有一个通用列表的格式,我正在为我的班级提供一个格式,这会是什么问题?

提前致谢...!!!

4

2 回答 2

3

当我从JsonFormat而不是JsonWriter扩展 MyClassJsonFormat 时,它看起来工作正常。看起来 CollectionFormats 特征仅在您从JsonFormat扩展时才有效

以下代码对我来说编译得很好

  object MyClassJsonProtocol extends DefaultJsonProtocol {

    implicit object MyClassJsonFormat extends JsonFormat[MyClass] {
    override def write(obj: MyClass): JsValue =
      JsObject(
        "name" -> JsString(obj.name)
      )

      override def read(json: JsValue): MyClass = new MyClass(json.convertTo[String])
    }
  }
于 2014-10-29T09:39:48.413 回答
0

原因似乎在这里提到:

仅使用 JsonReader/JsonWriter 可能会遇到的一个问题是,当您尝试为 Option 或集合查找 JsonReader/JsonWriter 时,它会为包含的类型查找 JsonFormat,这将失败。不确定我是否缺少可以解决该问题的东西。

你和我都遇到过这种情况。除了@user007 建议使用完整的JsonFormat. 这本身至少给我带来了更多的困难——我计划在课堂上使用默认阅读器。

那好吧...

于 2015-07-06T12:37:16.660 回答