微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

JSON:
val ajson = parse(“”“{”creationDate“:”2013-01-02T10:48:41.000-05:00“}”“”)

我还设置了这些序列化选项:
隐式val格式= Serialization.formats(NoTypeHints)net.liftweb.json.ext.JodaTimeSerializers.all

和反序列化:
val val1 = ajson.extract [发布]

帖子是:
case class Post(creationDate:DateTime){…}

我得到的例外是:

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相同的日期字符串.这里发生了什么事?

解决方法

似乎是Lift认使用的DateParser格式.在深入研究 the code时,您可以看到解析器在将结果传递给org.joda.time.DateTime的构造函数之前尝试使用DateParser.parse(s,format).

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐