我在我的应用程序中的案例类中编组可变对象时遇到了困难。 我使用了喷雾库,并且已经进行了必要的进口
import spray.json._
import DefaultJsonProtocol._
import spray.httpx.SprayJsonSupport._
但是当我尝试为我的case类提供伴随对象时,我收到以下错误。
case class CasePage(pageId:String,userList:ListBuffer[String],commentList:ListBuffer[String],picList:ListBuffer[String],likeList:ListBuffer[String])
object CasePage extends DefaultJsonProtocol {
implicit val impUser = jsonFormat5(CasePage.apply)
}
could not find implicit value for evidence parameter of type CasePage.JF[scala.collection.mutable.ListBuffer[String]]
没有可变对象的其他case类工作正常。只是遇到scala.collection.mutable类对象的问题。我错过了什么?
谢谢
答案 0 :(得分:1)
RootJsonFormat
需要ListBuffer
个实例。但请注意,在案例类中使用collection.mutable
不是惯用的Scala。
package com.example
import spray.json._
import DefaultJsonProtocol._
import scala.collection.mutable.ListBuffer
object SO33943345 {
case class CasePage(pageId: String,
userList: ListBuffer[String],
commentList: ListBuffer[String],
picList: ListBuffer[String],
likeList: ListBuffer[String])
implicit def listBufferFormat[T :JsonFormat] = new RootJsonFormat[ListBuffer[T]] {
def write(listBuffer: ListBuffer[T]) = JsArray(listBuffer.map(_.toJson).toVector)
def read(value: JsValue): ListBuffer[T] = value match {
case JsArray(elements) => elements.map(_.convertTo[T])(collection.breakOut)
case x => deserializationError("Expected ListBuffer as JsArray, but got " + x)
}
}
object CasePage extends DefaultJsonProtocol {
implicit val impUser = jsonFormat5(CasePage.apply)
}
def main(args: Array[String]): Unit = {
val cp = CasePage("1",
ListBuffer("User1", "User2"),
ListBuffer("Comment1", "Comment2"),
ListBuffer("Pic1", "Pic2"),
ListBuffer("Like1", "Like2"))
println(cp.toJson.prettyPrint)
}
}
答案 1 :(得分:-1)
Scala https://github.com/spray/spray-json是来自官方JSON实现的- 只要您的代码仅使用这些代码,就只需要DefaultJsonProtocol。以下是 DefaultJsonProtocol 已处理的类型:
@racetrack的实现有效,但是,您需要了解,由于副作用和可预测性差,可变状态通常与性能不佳相关。 Scala提倡进行函数式编程(换句话说,编程应避免副作用和不变的结构)。但是,它为命令式范例提供了类/集合,但这不是默认的。