Scala 找不到JsonSupport.this.JF[org.joda.time.LocalDateTime]类型的证据参数的隐式值

Scala 找不到JsonSupport.this.JF[org.joda.time.LocalDateTime]类型的证据参数的隐式值,scala,spray-json,Scala,Spray Json,我是spray json应用程序的初学者,我使用LocalDateTime作为case类中的参数类型之一 import scala.collection.JavaConverters._ import org.apache.commons.imaging.Imaging import org.joda.time.format.{DateTimeFormat, DateTimeFormatter} import org.joda.time.{DateTime, LocalDateTime} imp

我是spray json应用程序的初学者,我使用LocalDateTime作为case类中的参数类型之一

import scala.collection.JavaConverters._
import org.apache.commons.imaging.Imaging
import org.joda.time.format.{DateTimeFormat, DateTimeFormatter}
import org.joda.time.{DateTime, LocalDateTime}
import spray.json.DefaultJsonProtocol
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import JodaDateTimeFormats._
import spray.json._

case class ExifMetadata(docName:String, exifOffset:Int, gpsInfo:Int, dateTimeOriginal:LocalDateTime,
                        gpsLatitudeRef:String, gpsLatitude:Double, gpsLongitudeRef:String, gpsLongitude:Double, gpsDateStamp:LocalDateTime)

trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val exifMetadataFormat = jsonFormat9(ExifMetadata)
}
然而,我不断得到以下错误

could not find implicit value for evidence parameter of type JsonSupport.this.JF[org.joda.time.LocalDateTime]

首先:现在使用JodaTime是由作者提出的:

注意,从JavaSE8开始,用户被要求迁移到Java.time(JSR-310)——JDK的核心部分,它取代了这个项目

如果您仍然停留在JDK 7上(您这个可怜的混蛋),您应该仍然更喜欢使用,它提供了一个与JSR-310几乎相同的API。这将最大限度地减少升级摩擦


这样一来:Spray就不提供现成的JodaTime类的
JsonFormat
实例。你必须自己写。幸运的是,这并不难

您希望如何准确地用JSON表示LocalDateTime取决于您的用例,但标准ISO 8601格式是有意义的

import spray.json._

//prevent confusion with java.time.LocalDateTime
import org.joda.time.{LocalDateTime => JodaLocalDateTime}

implicit val jodaLocalDateTimeFormat: JsonFormat[JodaLocalDateTime] = 
  new JsonFormat[JodaLocalDateTime] {
    override def write(obj: JodaLocalDateTime): JsValue = JsString(obj.toString)

    override def read(json: JsValue): JodaLocalDateTime = json match {
      case JsString(s) => Try(JodaLocalDateTime.parse(s)) match {
        case Success(result) => result
        case Failure(exception) => 
          deserializationError(s"could not parse $s as Joda LocalDateTime", exception)
      }
      case notAJsString => 
        deserializationError(s"expected a String but got a $notAJsString")
    }
  }


确保在
JsonSupport
特性的顶部定义此
JsonFormat
。这样,它将可用于您的其他格式。

您从何处获得此编译错误?当我尝试使用扩展应用程序的对象运行上述操作时,该对象是否使用您的JsonSupport扩展应用程序?应该是的,是的。对象ExifExtractor使用JsonSupport{}扩展应用程序。啊,您仍然需要为LocalDateTime提供JsonFormat。我会写一个答案。你让我开心:)