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 上的普通类(非大小写)的主要内容,如果未能解决你的问题,请参考以下文章