喷json:无法转换为Array [myClass]

时间:2017-12-04 17:15:44

标签: scala spray-json

我在我的项目中学习scala / spray json并尝试将输入json转换为scala对象数组,但这会引发以下错误:

Error:(52, 43) not enough arguments for method convertTo: (implicit evidence$1: spray.json.JsonReader[Array[A$A57.this.myClass]])Array[A$A57.this.myClass].
Unspecified value parameter evidence$1.
lazy val output = ref.parseJson.convertTo[Array[myClass]];}
                                         ^
Error:(52, 43) Cannot find JsonReader or JsonFormat type class for Array[A$A57.this.myClass]
lazy val output = ref.parseJson.convertTo[Array[myClass]];}

^

这是我的代码段:

import spray.json.{JsArray, JsObject, _}
import spray.json.{JsArray, JsFalse, JsNumber, JsObject, JsString, JsTrue, JsValue, JsonFormat, _}

case class myClass (
                                                name: String,
                                                source: Map[String, Any],
                                                target: Map[String, Any])

trait myJsonProtocol extends DefaultJsonProtocol {
  implicit object AnyJsonFormat extends JsonFormat[Any] {
    def write(x: Any) = x match {
      case b: Boolean if b == true => JsTrue
      case b: Boolean if b == false => JsFalse
      case n: Int => JsNumber(n)
      case l: Long => JsNumber(l)
      case f: Float => JsNumber(f.toString)
      case d: Double => JsNumber(d.toString)
      case s: String => JsString(s)
      case a: Array[Any] => arrayFormat[Any].write(a)
      case m: Map[String, Any]@unchecked => mapFormat[String, Any].write(m)
      case x => serializationError("error Cannot determine object type " + x.getClass.getName)
    }

    def read(value: JsValue) = value match {
      case JsTrue => true
      case JsFalse => false
      case JsNumber(n) =>
        if (n.isValidInt) n.intValue()
        else if (n.isValidLong) n.longValue()
        else if (n.isDecimalFloat) n.floatValue()
        else if (n.isDecimalDouble) n.doubleValue()
        else n.intValue()
      case JsString(s) => s.toString
      case a: JsArray => arrayFormat[Any].read(a)
      case o: JsObject => mapFormat[String, Any].read(o)
      case x => deserializationError("error: Cannot deserialize " + x)
    }
  }

  implicit val myFormat = jsonFormat3(myClass.apply)
}

val ref = """[{
                           "name": "test-db",
                           "source": {
                           "mydbport": 50000
                           },
                           "target": {
                           "type": "newdb"
                           }
                           }]"""
val output = ref.parseJson.convertTo[Array[myClass]]

我从Serialize Map[String, Any] with spray json获取上述代码作为参考,但无法序列化Map [String,Any] 让我知道上面的代码有什么问题。

此致 加里

1 个答案:

答案 0 :(得分:0)

对于隐式方法,它们需要在类的实例范围内。由于这个特性没有实例化,这不起作用。您可以使用对象而不是特征。

如何让它发挥作用的一个例子是:

…
object myJsonProtocol extends DefaultJsonProtocol {
  implicit object AnyJsonFormat extends JsonFormat[Any] {
    …
  }

  implicit val myFormat = jsonFormat3(myClass.apply)
}

import myJsonProtocol.myFormat

val ref = """[{
                           "name": "test-db",
                           "source": {
                           "mydbport": 50000
                           },
                           "target": {
                           "type": "newdb"
                           }
                           }]"""
val output = ref.parseJson.convertTo[Array[myClass]]