Ошибки компиляции 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"
Другие вопросы по тегам