Spray-json 用于 List 上的普通类(非大小写)

Posted

技术标签:

【中文标题】Spray-json 用于 List 上的普通类(非大小写)【英文标题】:spray-json for normal classes (non case) on a List 【发布时间】:2014-12-24 04:50:49 【问题描述】:

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

提前谢谢...!!!

【问题讨论】:

【参考方案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 中)?烦人,因为我还需要阅读器,现在我必须想办法通过我的格式调用默认阅读器。

以上是关于Spray-json 用于 List 上的普通类(非大小写)的主要内容,如果未能解决你的问题,请参考以下文章

Spray-json 和列表编组

如何使用 AKKA-HTTP、spray-json、oauth2 和 slick 优化 scala REST api?

Scala,spray-json:通用枚举 json 格式

spray-json

使用 spray-json 处理默认值的好方法是啥

scala spray-json 如何解析一个复杂的 数组JSON