喷射 Json 编组可变对象
Spray Json Marshalling Mutable Objects
我在我的案例 class 中编组可变对象时遇到困难。
我正在使用喷雾库并且我已经进行了必要的导入
import spray.json._
import DefaultJsonProtocol._
import spray.httpx.SprayJsonSupport._
但是当我尝试为我的案例提供伴随对象时出现以下错误 class。
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]]
没有可变对象的另一种情况 classes 工作正常。只是遇到 scala.collection.mutable class 对象的问题。我错过了什么?
谢谢
您需要一个 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)
}
}
从官方得到这个 JSON 实现是 Scala https://github.com/spray/spray-json -
只要您的代码只使用这些,您只需要 DefaultJsonProtocol。以下是 DefaultJsonProtocol 已经处理的类型:
- 字节、短整型、整型、长整型、浮点型、双精度、字符型、单位、布尔型
- 字符串、符号
- BigInt, BigDecimal
- 选项,任一个,元组 1 - 元组 7
- 列表、数组
- 不可变。{Map、Iterable、Seq、IndexedSeq、LinearSeq、Set、Vector}
- collection.{Iterable, Seq, IndexedSeq, LinearSeq, Set}
- JsValue
@racetrack 的实现有效,但是,您需要了解,由于副作用和可预测性较低,可变状态通常与性能不佳相关联。 Scala 提倡函数式编程(或者换句话说,编程没有副作用和不可变结构)。然而,它为命令式范例提供了 classes/collections,但这不是默认的。
我在我的案例 class 中编组可变对象时遇到困难。 我正在使用喷雾库并且我已经进行了必要的导入
import spray.json._
import DefaultJsonProtocol._
import spray.httpx.SprayJsonSupport._
但是当我尝试为我的案例提供伴随对象时出现以下错误 class。
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]]
没有可变对象的另一种情况 classes 工作正常。只是遇到 scala.collection.mutable class 对象的问题。我错过了什么?
谢谢
您需要一个 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)
}
}
从官方得到这个 JSON 实现是 Scala https://github.com/spray/spray-json - 只要您的代码只使用这些,您只需要 DefaultJsonProtocol。以下是 DefaultJsonProtocol 已经处理的类型:
- 字节、短整型、整型、长整型、浮点型、双精度、字符型、单位、布尔型
- 字符串、符号
- BigInt, BigDecimal
- 选项,任一个,元组 1 - 元组 7
- 列表、数组
- 不可变。{Map、Iterable、Seq、IndexedSeq、LinearSeq、Set、Vector}
- collection.{Iterable, Seq, IndexedSeq, LinearSeq, Set}
- JsValue
@racetrack 的实现有效,但是,您需要了解,由于副作用和可预测性较低,可变状态通常与性能不佳相关联。 Scala 提倡函数式编程(或者换句话说,编程没有副作用和不可变结构)。然而,它为命令式范例提供了 classes/collections,但这不是默认的。