[英]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.