繁体   English   中英

scala json4s,无法转换LocalDate

[英]scala json4s, can't convert LocalDate

我遇到了 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(字符串中的整数和字节)一起使用,但是 java.time.LocalDate 与其他一些代码混淆,这可能是一个不同的问题......这个是:我我通过 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

新的序列化程序包含在库中,但不是默认格式:

implicit val formats: Formats = DefaultFormats ++ JavaTimeSerializers.all

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM