Ошибки компиляции Scala: "Неявное представление недоступно" и "Различающееся неявное расширение"
def MyFun(result: ListBuffer[(String, DateTime, List[(String, Int)])]):
String = {
val json =
(result.map {
item => (
("subject" -> item._1) ~
("time" -> item._2) ~
("student" -> item._3.map {
student_description=> (
("name" -> lb_result._1) ~
("age" -> lb_result._2)
)
})
)
}
)
val resultFormat = compact(render(json))
resultFormat
}
ошибка 1: неявное представление не доступно из org.joda.time.DateTime => org.json4s.JsonAST.JValue.("subject" -> item._1) ~
ошибка 2: расходящееся неявное расширение для типа Nothing => org.json4s.JsonAST.JValue, начинающееся с метода seq2jvalue в признаке JsonDSL val resultFormat = compact(render(json))
2 ответа
Я намекнул на json4s-ext для поддержки joda-time, но только импорт этого подмодуля не решит вашу проблему.
JsonDSL используется для создания JValues
а сериализаторы используются только для поворота JValues
в JSON и наоборот (сериализация и десериализация).
Если мы попытаемся создать более простой объект JSON с DateTime
:
val jvalue = ("subj" -> "foo") ~ ("time" -> DateTime.now)
Мы получаем ту же ошибку:
error: No implicit view available from org.joda.time.DateTime => org.json4s.JsonAST.JValue.
Как я уже сказал, сериализаторы для DateTime
из json4s-ext не используются, когда мы используем JsonDSL для создания JValues
,
Вы можете создать неявную функцию DateTime => JValue
или сделать что-то вроде DateTime.now.getMillis
или же DateTime.now.toString
создать соответственно JInt
или JString
, но зачем нам изобретать велосипед, если уже существуют сериалы joda time?
Мы можем ввести некоторые классы дел для хранения данных в result
и тогда json4s может их сериализовать для нас:
import scala.collection.mutable.ListBuffer
import com.github.nscala_time.time.Imports._
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization
import org.json4s.native.Serialization.{read, write}
implicit val formats =
Serialization.formats(NoTypeHints) ++ org.json4s.ext.JodaTimeSerializers.all
case class Lesson(subject: String, time: org.joda.time.DateTime, students: List[Student])
case class Student(name: String, age: Int)
val result = ListBuffer(("subj", DateTime.now, ("Alice", 20) :: Nil))
val lessons = result.map { case (subj, time, students) =>
Lesson(subj, time, students.map(Student.tupled))
}
write(lessons)
// String = [{"subject":"subj","time":"2015-09-09T11:22:59.762Z","students":[{"name":"Alice","age":20}]}]
Обратите внимание, что вам все еще нужно добавить json4s-ext, как объяснил Андреас Нейман.
Как уже сказал Питер Нейенс для сериализации org.joda.time.DateTime
ты нед пакет
https://github.com/json4s/json4s
Так что добавьте эту зависимость к вам build.sbt
libraryDependencies += "org.json4s" %% "json4s-ext" % "3.2.11"