【问题标题】:spray-json for normal classes (non case) on a ListSpray-json 用于 List 上的普通类(非大小写)
【发布时间】:2024-04-30 13:45:02
【问题描述】:

我发现自己处于需要将非 case 类序列化为 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 已经有通用列表的格式,我正在为我的班级提供格式,会有什么问题?

提前谢谢...!!!

【问题讨论】:

    标签: scala scala-2.10 spray-json


    【解决方案1】:

    原因好像提到了here

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

    你和我都遇到过这种情况。除了@user007 建议使用完整的JsonFormat 之外,我目前没有其他出路。这本身至少给我带来了更多的困难——我打算在我的课堂上使用默认阅读器。

    哦,好吧……

    【讨论】:

    • 我建议你使用 json4s。它会让你的生活更轻松。至少那是我最终做的。一点都不后悔。
    • 感谢您的建议,但我对 spray-json 很满意,否则。
    【解决方案2】:

    当我从 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])
        }
      }
    

    【讨论】:

    • 谢谢。它有效,但我仍然不知道为什么不包含 CollectionFormats 特征。我将它显式添加到导入中,但会编译 ether。
    • 无需导入 CollectionFormats。 DefaultJsonProtocol 扩展了所有这些特征 - github.com/spray/spray-json/blob/master/src/main/scala/spray/…
    • 我知道,但是它没有解释为什么在扩展 JsonWriter 而不是 JsonFormat 时它不起作用。仍在扩展 DefaultJsonProtocol。
    • 我也有同样的行为 - 编写 Writer 并没有任何影响。更改为格式可以。我想知道幕后发生了什么 - 这是一个错误(在 spray.json 中)?烦人,因为我还需要阅读器,现在我必须想办法通过我的格式调用默认阅读器。
    最近更新 更多