我在我的项目中学习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] 让我知道上面的代码有什么问题。
此致 加里
答案 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]]