我在org.json4s(scala),joda.time.LocalDate和org.json4s.ext.JodaTimeSerializers中遇到问题。鉴于JodaTimeSerializers.all中有一个LocalDate转换,我希望可以执行以下操作,但是出现以下异常

scala> import org.json4s.JString
import org.json4s.JString

scala> import org.joda.time.LocalDate
import org.joda.time.LocalDate

scala> import org.json4s.ext.JodaTimeSerializers
import org.json4s.ext.JodaTimeSerializers

scala> import org.json4s._
import org.json4s._

scala> implicit val formats: Formats = DefaultFormats ++ JodaTimeSerializers.all
formats: org.json4s.Formats = org.json4s.Formats$$anon$3@693d3d7f

scala> val jDate = JString("2016-01-26")
jDate: org.json4s.JsonAST.JString = JString(2016-01-26)

scala> jDate.extract[LocalDate]
org.json4s.package$MappingException: Can't convert JString(2016-01-26) to class org.joda.time.LocalDate

另一方面,这有效(不足为奇)
scala> val jodaDate = LocalDate.parse(jDate.values)

我试图创建一个自定义的序列化器,它从未被称为b / c,它似乎属于JodaSerializer领域。我还创建了一个自定义反序列化程序,它将与Java.time.LocalDate(字符串中的int和字节)一起使用,但是java.time.LocalDate与其他一些代码混淆了,这可能是一个不同的问题...这个是:我m通过JodaTimeSerializers寻找线索。all无法解析JString(2016-01-26)或任何日期字符串。

异常的顶部是:org.json4s.package $ MappingException:
Can't convert JString(2016-01-01) to class org.joda.time.LocalDate (JodaTimeSerializers.scala:126)

编辑
这仍然让我感到痛苦,因此请进一步挖掘它,并在以下内容中重现它。
import org.joda.time.LocalDate
import org.json4s.ext.JodaTimeSerializers
import org.json4s._
implicit val formats: Formats = DefaultFormats ++ JodaTimeSerializers.all
import org.joda.time.LocalDate
case class MyDate(myDate: LocalDate)
val stringyDate =
"""
{
  "myDate" : "2016-01-01"
}
"""
import org.json4s.jackson.JsonMethods.parse
parse(stringyDate).extract[MyDate]

org.json4s.package$MappingException: No usable value for myDate
Can't convert JString(2016-01-01) to class org.joda.time.LocalDate

这似乎发生在JodaTimeSerializers.scala的第125行的b / c上,它不是JObject,而是JString,因此它属于第126行的值情况,从而引发错误。

如果在这里添加它以防被其他人咬伤,并希望得到一些修复它的帮助...但是现在我来晚了。我希望将代码移到本地,以便明天解决。

最佳答案

这可行。我为LocalDate定义了一个自定义序列化程序。

import org.json4s.JString
import org.joda.time.LocalDate
import org.json4s._

case object LocalDateSerializer
    extends CustomSerializer[LocalDate](
      format =>
        ({
          case JString(s) => LocalDate.parse(s)
        }, Map() /* TO BE IMPLEMENTED */)
    )

implicit val formats: Formats = DefaultFormats + LocalDateSerializer
val jDate = JString("2016-01-26")
jDate.extract[LocalDate] // res173: org.joda.time.LocalDate = 2016-01-26

关于scala - Scala json4s,无法转换LocalDate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35039852/

10-11 17:00