преобразовать json в массив объектов scala с помощью спрея json

Я не очень хорошо знаком со спреем json, но мне нужно преобразовать приведенный ниже json в Array [myTest]

Ниже приведен код, но он не работает. Выдает следующие ошибки: Как их исправить?

Error:(19, 54) Cannot find JsonReader or JsonFormat type class for Array[A$A61.this.myTest]
lazy val converted= trainingDataRef.toJson.convertTo[Array[myTest]]
                                                    ^
Error:(19, 54) not enough arguments for method convertTo: (implicit evidence$1: spray.json.JsonReader[Array[A$A61.this.myTest]])Array[A$A61.this.myTest].
Unspecified value parameter evidence$1.
lazy val converted= trainingDataRef.toJson.convertTo[Array[myTest]]
                                                    ^
Error:(10, 61) could not find implicit value for evidence parameter of type spray.json.DefaultJsonProtocol.JF[Map[String,Any]]
  implicit val format: RootJsonFormat[myTest] = jsonFormat3(myTest.apply)


                                          ^


   Code:                           ^
import spray.json.DefaultJsonProtocol._
import spray.json._

case class myTest (
                        id: String,
                        classDetails: Map[String, Any],
                        school: Map[String, Any])
object myTest {
  implicit val format: RootJsonFormat[myTest] = jsonFormat3(myTest.apply)
}


val trainingDataRef = """[{"id":"my-id","classDetails":{"sec":"2","teacher":"John"},"school":{"name":"newschool"}}]"""

println(trainingDataRef.getClass)


val converted= trainingDataRef.toJson.convertTo[Array[myTest]]
println(converted)

person Pratap D    schedule 28.11.2017    source источник
comment
Эти Map[String, Any] неприятны   -  person mfirry    schedule 28.11.2017
comment
хорошо, это можно изменить, каков был бы осуществимый способ? Должен ли я использовать JsonNode вместо Map [String, Any]?   -  person Pratap D    schedule 28.11.2017


Ответы (1)


Spray-json имеет хорошую документацию, попробуйте посмотреть там. По сути, вы должны определить свои классы case и реализовать для них JsonFormat:

import spray.json.DefaultJsonProtocol._
import spray.json._

case class ClassDetails(sec: String, teacher: String)
object ClassDetails {
  implicit val format: RootJsonFormat[ClassDetails] = jsonFormat2(ClassDetails.apply)
}

case class School(name: String)
object School {
  implicit val format: RootJsonFormat[School] = jsonFormat1(School.apply)
}

case class ClassInfo
(
  id: String,
  classDetails: ClassDetails,
  school: School
)

object ClassInfo {
  implicit object ClassInfoFormat extends RootJsonFormat[ClassInfo] {
    def write(c: ClassInfo): JsValue = JsObject(
      "id" -> JsString(c.id),
      "classDetails" -> c.classDetails.toJson,
      "school" -> c.school.toJson
    )
    def read(value: JsValue): ClassInfo = {
      value.asJsObject.getFields("id", "classDetails", "school") match {
        case Seq(JsString(name), details, school) =>
          new ClassInfo(name, details.convertTo[ClassDetails], school.convertTo[School])
        case _ => throw new DeserializationException("ClassInfo expected")
      }
    }
  }
}

val json = """[{"id":"my-id","classDetails":{"sec":"2","teacher":"John"},"school":{"name":"newschool"}}]"""
// JSON string to case classes
val classInfos = json.parseJson.convertTo[Seq[ClassInfo]]
classInfos.zipWithIndex.foreach { case (c, idx) =>
  println(s"$idx => $c")
}
println
// Seq[ClassInfo] to JSON
println(s"$classInfos: ")
println(classInfos.toJson.prettyPrint)
person Artavazd Balayan    schedule 28.11.2017
comment
Большое спасибо, это помогло. Но почему в моем случае я получаю дополнительные поля и значения, добавленные к json EX: - person Pratap D; 29.11.2017
comment
[{id: my-id, classDetails: {fields: {sec: {value: 2}, учитель: {value: John}}}, школа: {fields: {name: {value: newschool}}}}] - person Pratap D; 29.11.2017
comment
Вы что-то изменили? Потому что я не вижу дополнительных полей. Вот мой результат: pastebin.com/1NwK2Vak. Я использую spray-json 1.3.3 - person Artavazd Balayan; 29.11.2017
comment
Я должен отправить это другому вызывающему абоненту, там json изменяется, как указано выше. В этом приложении они получают json и копируют его в другой класс case, используя as [], но этот класс case аналогичен приведенному выше. Я не могу это контролировать, мне нужно только отправить правильный ввод - person Pratap D; 29.11.2017
comment
кстати, я изменил класс case, как показано ниже: case class ClassInfo (id: String, classDetails: JsValue, school: JsValue) - person Pratap D; 29.11.2017
comment
Вы изменили класс case, поэтому теперь вы видите другой результат. Так что, вероятно, вам нужно четко понимать, что вы вводите и каков ваш результат. - person Artavazd Balayan; 29.11.2017