спрей json: невозможно преобразовать в массив [myClass]

Я изучаю 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] с помощью spray json но не может сериализовать Map[String,Any] Сообщите мне, что не так с приведенным выше кодом.

С уважением, Гэри


person Gary    schedule 04.12.2017    source источник


Ответы (1)


Чтобы неявные методы работали, они должны находиться в области видимости экземпляра класса. Поскольку черта нигде не инстанцируется, это не работает. Вы можете использовать объект вместо типажа.

Пример того, как вы могли бы заставить это работать:

…
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]]
person Mark    schedule 05.12.2017