gpt4 book ai didi

scala - 如何在 Lift 中反序列化 DateTime

转载 作者:行者123 更新时间:2023-12-04 23:04:28 27 4
gpt4 key购买 nike

我无法将 org.joda.time.DateTime 字段从 JSON 反序列化为案例类。

JSON:val ajson=parse(""" { "creationDate": "2013-01-02T10:48:41.000-05:00" }""")
我还设置了这些序列化选项:implicit val formats = Serialization.formats(NoTypeHints) ++ net.liftweb.json.ext.JodaTimeSerializers.all
和反序列化:val val1=ajson.extract[Post]
邮政是:case class Post(创建日期 : DateTime){ ... }
我得到的异常(exception)是:

 net.liftweb.json.MappingException: No usable value for creationDate
Invalid date format 2013-01-02T10:48:41.000-05:00

如何将该日期字符串反序列化为 DateTime 对象?

编辑:
这个作品: val date3= new DateTime("2013-01-05T06:24:53.000-05:00")它使用与反序列化相同的来自 JSON 的日期字符串。这里发生了什么事?

最佳答案

好像是DateParser Lift 默认使用的格式。中挖the code ,可以看到解析器尝试使用 DateParser.parse(s, format)在将结果传递给 org.joda.time.DateTime 的构造函数之前.

object DateParser {
def parse(s: String, format: Formats) =
format.dateFormat.parse(s).map(_.getTime).getOrElse(throw new MappingException("Invalid date format " + s))
}

case object DateTimeSerializer extends CustomSerializer[DateTime](format => (
{
case JString(s) => new DateTime(DateParser.parse(s, format))
case JNull => null
},
{
case d: DateTime => JString(format.dateFormat.format(d.toDate))
}
))

Lift 似乎使用的格式是: yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
为了解决这个问题,您可以指定正确的模式并将其添加到您的序列化选项中,或者如果您希望让 JodaTime 构造函数完成所有工作,您可以创建自己的序列化程序,例如:
case object MyDateTimeSerializer extends CustomSerializer[DateTime](format => (
{
case JString(s) => tryo(new DateTime(s)).openOr(throw new MappingException("Invalid date format " + s))
case JNull => null
},
{
case d: DateTime => JString(format.dateFormat.format(d.toDate))
}
))

然后将其添加到您的格式列表中,而不是 net.liftweb.json.ext.JodaTimeSerializers.all

关于scala - 如何在 Lift 中反序列化 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com