是否有可能使用具有纳秒值的杰克逊

Jim*_*m C 4 java datetime json jackson fasterxml

在从对象解析为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.390452user.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
}
Run Code Online (Sandbox Code Playgroud)

//主要课程

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();
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

// 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>
Run Code Online (Sandbox Code Playgroud)

//安慰

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]
Run Code Online (Sandbox Code Playgroud)

gkn*_*ker 6

是的,有可能使用具有纳秒值的杰克逊; 保存纳秒的Java 8,你可以使用java.util.Datejava.sql.Timestamp(假设你没有禁用杰克逊配置DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDSSerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,这是默认启用).

在Java 8之前,您可以使用a java.math.BigDecimal来存储自纪元以来的天数以及一天中的小数时间.或者只是将值保存在String表示中.Java 7和早期版本在日期中不保留纳秒,仅为几毫秒.因此,如果将值转换java.util.Date为其子类或其中一个子类java.sql.Timestamp,则精度仅为毫秒.因此java.text.DateFormat,如果您使用它在Java 8之前的环境中转换为任何类型的Java Date,则此方法没有用处.

以下是java Timestamps中纳秒的进一步讨论:java.sql.Timestamp存储NanoSeconds的方式