在从对象解析为json和反之亦然时,我有可能想象的最长时间工作纳秒。我创造了最简单的杰克逊使用方法,我无法获得纳秒。以下是我的演示。在fastxml FAQ中有三个与我的案例相关的重要声明。前两个给了我工作的诀窍,第三个告诉我不要使用sql.Date
但sql.timestamp
是sql.Date
的“儿子”。
问题是:
首先,
mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,true)
和@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSSSSS")
根本不起作用。我可以false
,true
,甚至不使用mapper.configure
,使用或不使用@JsonFormat
,结果将是相同的,
其次,如果我只尝试反序列化,我的意思是,在2015-01-07 11:37:52.390452
中输入值user.json
,只运行mapper.readValue
我会得到值2015-01-07 11:44:22.452
,所以我错过了确切的价值,因为Jacskon围捕。
来自http://wiki.fasterxml.com/JacksonFAQDateHandling
1 - Feature.WRITE_DATES_AS_TIMESTAMPS,false);禁用使用 时间戳(数字),而是使用[ISO-8601]兼容 符号,输出如下: “1970-01-01T00:00:00.000 + 0000”。
2 - 您可以通过传递java.text.DateFormat
来配置格式3 - 请永远不要使用java.sql.Date!
// pojo
package com.jim.core;
import java.sql.Timestamp;
import com.fasterxml.jackson.annotation.JsonFormat;
public class User {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSSSSS")
private Timestamp tsFirstTry;
private Timestamp tsSecondTry;
@Override
public String toString() {
return "User [tsFirstTry=" + tsFirstTry + ", tsSecondTry=" + tsSecondTry + "]";
}
//getters and setters
}
//主要课程
package com.jim.core;
import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class Main {
public static void main(String[] args) {
User user = new User();
user.setTsFirstTry(Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())));
user.setTsSecondTry(Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())));
System.out.println("firstTryValue = "+ Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())));
System.out.println("secondTryValue = "+ Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())));
ObjectMapper mapper = new ObjectMapper();
try {
//mapper.setTimeZone(TimeZone.getTimeZone("UTC"));
//mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,true);
//mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,true);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"));
//Serialization - saving the created objects in the sequence of bytes.
mapper.writeValue(new File("c:\\temp\\user.json"), user);
System.out.println("Serialized Outcome = " + mapper.writeValueAsString(user));
//Deserialization - Retrieving those saved bytes into the form of original object.
user = mapper.readValue(new File("c:\\temp\\user.json"), User.class);
System.out.println("Deserialized Outcome = " + user);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// pom(仅限相关部分)
<properties>
<java-version>1.6</java-version>
<jackson.databind-version>2.2.3</jackson.databind-version>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
//控制台
firstTryValue = 2015-01-08 11:31:53.000773
secondTryValue = 2015-01-08 11:31:53.000773
Serialized Outcome = {"tsFirstTry":"2015-01-08 17:31:53.000000","tsSecondTry":"2015-01-08 11:31:53.000000"}
Deserialized Outcome = User [tsFirstTry=2015-01-08 11:31:53.0, tsSecondTry=2015-01-08 11:31:53.0]
答案 0 :(得分:6)
是的,有可能使用具有纳秒值的Jackson;为了在Java 8中保留纳秒,您可以使用java.util.Date
或java.sql.Timestamp
(假设您没有禁用默认启用的Jackson配置DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS
和SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
)。
在Java 8之前,您可以使用java.math.BigDecimal
来存储自纪元以来的天数加上一小时的分数。或者只是将值保存在String表示中。 Java 7和早期版本在日期中不保留纳秒,仅为几毫秒。因此,如果将值转换为java.util.Date
或其子类之一(如java.sql.Timestamp
),则精度仅为毫秒。因此,如果您使用它在Java 8之前的环境中转换为任何类型的Java Date,java.text.DateFormat
在这里没用。
以下是java时间戳中纳秒的进一步讨论:java.sql.Timestamp way of storing NanoSeconds