喷射Json编组可变物体

时间:2015-11-26 16:31:43

标签: scala spray-json

我在我的应用程序中的案例类中编组可变对象时遇到了困难。 我使用了喷雾库,并且已经进行了必要的进口

    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类对象的问题。我错过了什么?

谢谢

2 个答案:

答案 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 已处理的类型:

  • 字节,短整数,整数,长整数,浮点数,双精度,字符,单位,布尔值
  • 字符串,符号
  • BigInt,BigDecimal
  • 选项,元组1-元组7
  • 列表,数组
  • 不可变。{Map,Iterable,Seq,IndexedSeq,LinearSeq,Set,Vector}
  • 集合。{Iterable,Seq,IndexedSeq,LinearSeq,Set}
  • JsValue

@racetrack的实现有效,但是,您需要了解,由于副作用和可预测性差,可变状态通常与性能不佳相关。 Scala提倡进行函数式编程(换句话说,编程应避免副作用和不变的结构)。但是,它为命令式范例提供了类/集合,但这不是默认的。