找不到案例类的 JsonWriter 或 JsonFormat 类型类

Posted

技术标签:

【中文标题】找不到案例类的 JsonWriter 或 JsonFormat 类型类【英文标题】:Cannot find JsonWriter or JsonFormat type class for a case class 【发布时间】:2015-03-18 09:57:11 【问题描述】:

按照http://www.smartjava.org/content/first-steps-rest-spray-and-scala 的教程,有一些意外的错误消息。到底是怎么回事?我是否通过 implicit val personFormat = jsonFormat3(Person) 调用定义了隐式 JsonWriter?

scala> import spray.json.DefaultJsonProtocol
import spray.json.DefaultJsonProtocol

scala> object MyJsonProtocol extends DefaultJsonProtocol 
  implicit val personFormat = jsonFormat3(Person)

     |      | defined object MyJsonProtocol

scala> case class Person(name: String, fistName: String, age: Long)
defined class Person

scala> import spray.json._
import spray.json._

scala> import MyJsonProtocol._
import MyJsonProtocol._

scala> Person(name="a", fistName="b", age = 10).toJson
<console>:45: error: Cannot find JsonWriter or JsonFormat type class for Person
              Person(name="a", fistName="b", age = 10).toJson
                                                       ^

【问题讨论】:

【参考方案1】:

从您的会话看来,好像您在声明 Person 类之前定义了协议,这意味着您已经有另一个 Person 类在范围内。定义协议后,您重新定义Person 类,因此无法找到格式。所以总结一下,请确保您首先声明您的Person 类,然后定义您的格式。

编辑:更新答案

【讨论】:

尝试了许多不同的导入,包括这些,但错误消息仍然存在。我编辑了问题。 如果我在声明协议之前执行新会话并声明 Person 类,则会话成功(它返回 Person(name="a", fistName="b", age = 10).toJson)。所以我假设,您实际上是在声明格式之前声明了 Person 类? 你是对的!我尝试了不同的课程并且它有效!将其添加到答案中,我会接受... 当类位于多个文件中并且我使用 sbt 编译它们时,情况会变得更糟。似乎它们是按字母顺序编译的,忽略了导入... 我不确定我是否理解。您能否发布一个演示问题的最小示例(可能是一个要点以避免编辑问题)或提出一个新问题?

以上是关于找不到案例类的 JsonWriter 或 JsonFormat 类型类的主要内容,如果未能解决你的问题,请参考以下文章

spray-json 找不到 List[T] 类型的 JsonReader

找不到使用 Json 的类的序列化程序

Class org.apache.struts2.json.JSONWriter can not access a member of

struts2 java.lang.StackOverflowError org.apache.struts2.json.JSONWriter

Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader(示例代

JsonWriter POST 在 Android 中无法工作到 WCF Web 服务