在从对象解析到json和逆向分析时,我有最糟糕的时间来处理纳秒。我创造了最简单的杰克逊的使用,我无法得到纳秒。下面是我的演示。fasterxml 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,结果都是一样的,
其次,如果我只尝试反序列化,我的意思是,在user.json中输入值mapper.readValue,然后只运行mapper.readValue,我将得到值2015-01-07 11:44:22.452,所以我忽略了确切的值,因为Jacskon舍入了。
来自http://wiki.fasterxml.com/JacksonFAQDateHandling
1- Feature.WRITE_DATES_AS_TIMESTAMPS,false);它禁用时间戳(数字)的使用,而是使用ISO-8601 -compliant表示法,它的输出类似于"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]发布于 2015-01-08 19:16:34
是的,可以使用具有纳秒值的Jackson;要在Java8中保留纳秒,可以使用java.util.Date或java.sql.Timestamp (假设您没有禁用默认启用的Jackson配置DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS和SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS )。
在Java 8之前,您可以使用一个java.math.BigDecimal来存储从纪元开始的天数加上一天的小数时间。或者将值保留在其字符串表示形式中。Java 7和以前的版本不保留纳秒的日期,只有毫秒。因此,如果将值转换为java.util.Date或它的一个子类(如java.sql.Timestamp ),则精度仅为毫秒。因此,如果您在Java8之前的环境中使用java.text.DateFormat来转换成任何类型的java日期,那么它在这里是没有用的。
下面是关于java时间戳中纳秒的进一步讨论:java.sql.Timestamp way of storing NanoSeconds
https://stackoverflow.com/questions/27847203
复制相似问题