【问题标题】:Json4s: Conversion to java.sql.Timestamp does not workJson4s:转换为 java.sql.Timestamp 不起作用
【发布时间】:2014-12-10 18:24:24
【问题描述】:

我有一个案例类 Ab。

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

我得到了一个 JSON 表示。

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

Json4s 显然不支持时间戳,所以我创建了一个自定义序列化程序,例如:


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())
  }))

【问题讨论】:

    标签: json scala playframework-2.0 json4s


    【解决方案1】:

    只需覆盖默认的 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]
    

    【讨论】:

      【解决方案2】:

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

      我看到了两种解决方案:要么使用自己的时间戳类,要么使用与默认 Date 序列化程序一起使用的不同序列化格式。

      【讨论】:

      • 我已经为 java.sql.Date 编写了一个自定义序列化程序,与上面完全一样,效果很好。另外,如果我更改为 JInt(i) => new Timestamp(i),那么它也可以工作。所以,我不认为,问题是因为扩展 java.util.Date
      • 默认日期序列化器不处理 JInts,因为它们是部分函数,​​然后它将回退到 CustomSerialiser,请参阅 S Karthik 关于如何覆盖默认行为的答案(在您的示例中,您的代码从未称为)。
      • 有道理。谢谢!
      猜你喜欢
      • 2013-09-28
      • 2013-01-27
      • 2012-09-12
      • 1970-01-01
      • 2012-06-27
      • 2012-10-27
      • 1970-01-01
      • 2018-12-24
      • 2012-02-18
      相关资源
      最近更新 更多