Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala/Jerkson:在Json中指定日期对象的格式_Java_Json_Scala_Datetime_Jackson - Fatal编程技术网

Java Scala/Jerkson:在Json中指定日期对象的格式

Java Scala/Jerkson:在Json中指定日期对象的格式,java,json,scala,datetime,jackson,Java,Json,Scala,Datetime,Jackson,我正在使用(包装器)序列化包含日期的对象: 其结果是: {"dTest":1353576079168} 有没有办法指定格式或覆盖生成函数? 我意识到Json没有正确的日期类型,因此输出(unix时间单位为毫秒)是“正确的”。我希望将我的日期序列化为字符串(带有时间/时区)格式:2007-04-05T01:12:22+0100,因为它易于解析和人类可读Date的toString吐出Thu Nov 22 10:27:54 CET 2012这里有两个问题。首先,ISO8601日期的小问题-可以使用S

我正在使用(包装器)序列化包含
日期的对象:

其结果是:

{"dTest":1353576079168}
有没有办法指定格式或覆盖生成函数?


我意识到Json没有正确的日期类型,因此输出(unix时间单位为毫秒)是“正确的”。我希望将我的日期序列化为字符串(带有时间/时区)格式:
2007-04-05T01:12:22+0100
,因为它易于解析和人类可读
Date
的toString吐出
Thu Nov 22 10:27:54 CET 2012

这里有两个问题。首先,ISO8601日期的小问题-可以使用SimpleDateFormat实现,例如:

import java.text._
import java.util._
val d1 = new Date()
val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
println(sdf.format(d1))
格式化程序将解析和格式化。记住不要在线程之间共享它(而是在使用前始终在本地范围内创建一个实例),因为它不是线程安全的

其次,更棘手的问题是在Jerkson中自动使用日期。这似乎是Jerkson的一个不如liftjson的特性。后者允许将自定义解析器/格式化程序代码插入到解析层中。我想杰克森没有

我们只是通过忽略它来绕过这个限制。我们喜欢Jerkson的优越性能,所以我们只使用Long和String进行数据传输,并分别处理解析。比如说

case class JTest(val dTest: String) {
  lazy val dTestDate: Date = {
    val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
    sdf.parse(dTest)
  }
}

看看如何将日期转换成所需格式的字符串。不过,聪明的解决方法会给我带来一些其他问题。我的模型也用作数据库模式(squeryl),字段必须是“Date”才能正确映射。我发现Jerkson支持一个“@transient”注释,它在json中省略了它。Squeryl支持“@Transient”,这对持久性也有同样的作用。如果我能找到一种方法来重命名VAL(映射到json时),我可以做一个“透明”的解决方案。上面我没有提到的“其他”解决方案是编写成对的case类。一个版本支持Jerkson和另一个Squeryl(或任何其他用法)。后者可以有一个适配器“apply()”方法来从前者构造它,反之亦然。这需要两倍的代码,但允许将Jerkson版本视为短期数据传输对象。我喜欢这个想法,我会尝试一下。我会继续寻找一种“正确”的方法,但我不是很乐观,所以我可能最终会找到一个或多个解决方法。谢谢你的建议,如果你有什么想法,请告诉我!
case class JTest(val dTest: String) {
  lazy val dTestDate: Date = {
    val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
    sdf.parse(dTest)
  }
}