喷射 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,但这不是默认的。