Json4s:转换为java.sql.Timestamp不起作用

时间:2014-12-10 18:24:24

标签: json scala playframework-2.0 json4s

我有一个案例类Ab。

case class Ab(
   startTime: java.sql.Timestamp)

我得到了一个JSON表示。

 {"startTime":"2014-12-12 11:12:12"}

Json4s显然不支持Timestamp,所以我创建了一个自定义序列化器,如:


case object TimestampSerializer extends CustomSerializer[Timestamp](format => (
  {
    case JString(s) => {
      Timestamp.valueOf(s)
    }
    case JNull => null
  },
  {
    case tm: Timestamp => JString(tm.toString())
  }))

但是,当我尝试提取值时,我得到一个映射异常。

我的代码


org.json4s.jackson.JsonMethods.parse(""" {"startTime":"2014-12-12 11:12:12"} """).toString
//JObject(List((startTime,JString(2014-12-12 11:12:12))))
org.json4s.jackson.JsonMethods.parse("""  {"startTime":"2014-12-12 11:12:12"} """).extract[Ab]
//MappingException: No usable value for startTime
//Invalid date '2014-12-12 11:12:12'

编写像这样的序列化工具:


case object TimestampSerializer extends CustomSerializer[Timestamp](format => (
  {
    case JInt(s) => {
      new Timestamp(s)
    }
    case JNull => null
  },
  {
    case tm: Timestamp => JString(tm.toString())
  }))

2 个答案:

答案 0 :(得分:5)

只需覆盖默认的dateFormatter。它对我有用。

case class Test(startTime: Timestamp)

implicit val formats = new DefaultFormats {
    override def dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  }

val t1 = parse("""{"startTime":"2014-12-12 11:12:12"}""").extract[Test]

答案 1 :(得分:1)

Timestamp扩展了java.util.Date。这意味着您不会调用自定义序列化程序,而是使用不同格式的标准日期序列化程序。

我看到两个解决方案:要么使用自己的时间戳类,要么使用与默认日期序列化程序一起使用的其他序列化格式。