Java 是否可以使用具有纳秒值的Jackson

Java 是否可以使用具有纳秒值的Jackson,java,json,datetime,jackson,fasterxml,Java,Json,Datetime,Jackson,Fasterxml,在从object解析到json和json的过程中,我用纳秒的时间做了最糟糕的事情。我创造了杰克逊最简单的可能用途,但我无法获得纳秒。下面是我的演示。FasterXMLFAQ中有三条重要的语句与我的案例相关。前两个告诉我如何工作,第三个告诉我不要使用sql.Date,而是sql.timestamp是sql.Date的“儿子” 这些问题是: 首先,, mapper.configure(反序列化功能。读取时间戳为纳秒,true)和@JsonFormat(pattern=“yyyy-MM-dd HH:M

在从object解析到json和json的过程中,我用纳秒的时间做了最糟糕的事情。我创造了杰克逊最简单的可能用途,但我无法获得纳秒。下面是我的演示。FasterXMLFAQ中有三条重要的语句与我的案例相关。前两个告诉我如何工作,第三个告诉我不要使用
sql.Date
,而是
sql.timestamp
sql.Date
的“儿子”

这些问题是:

首先,,
mapper.configure(反序列化功能。读取时间戳为纳秒,true)
@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss.ssss”)
完全无效。我可以放置
false
true
,甚至不使用
映射器。配置
,使用或不使用
@JsonFormat
,结果将是相同的

其次,如果我只尝试反序列化,我的意思是,在
user.json
中输入值
2015-01-07 11:37:52.390452
,然后只运行
mapper.readValue
我将得到值
2015-01-07 11:44:22.452
,因此我错过了确切的值,因为Jacskon进行了四舍五入

1-Feature.WRITE_DATES_作为时间戳,false);哪一个禁止使用 时间戳(数字),而是使用符合[ISO-8601]的 表示法,其输出类似于: “1970-01-01T00:00:00.000+0000”

2-您可以通过传递java.text.DateFormat来配置格式

3-请永远不要使用java.sql.Date

//波乔

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(仅相关部分)


是的,可以使用具有纳秒值的Jackson;要在Java8中保留纳秒,可以使用
Java.util.Date
Java.sql.Timestamp
(假设您没有禁用默认启用的Jackson配置和)

在Java8之前,您可以使用
Java.math.BigDecimal
存储从历元开始的天数加上一天中的分数时间。或者只是将值保留在其字符串表示形式中。Java7和以前的版本不保留纳秒的日期,只保留毫秒。因此,如果将该值转换为
java.util.Date
或其子类之一,如
java.sql.Timestamp
,则精度仅为毫秒。因此,如果在Java8之前的环境中使用
java.text.DateFormat
转换为任何类型的java日期,则它在这里没有用处


下面是对java时间戳中纳秒的进一步讨论:

假设我有一个在域层中有100个pojo类的遗留应用程序,我确实需要使用它们分别对Json/对象进行序列化和反序列化(请接受此场景)。它们都至少有一个sql.timestamp属性。杰克逊专家组的建议是什么?我应该将代码从时间戳更改为字符串还是BigDecimal?当面对纳秒级的时间时,这是Jackson规范提出的真正解决方案吗?新的SimpleDateFormat(“YYYY MM DDH H: MM:SSSSSS”)打印纳秒。在这种情况下,必须使用POJO中的字符串吗?附加地,我应该考虑映射器。配置(反序列化特征。作为不可行的可能性。我阅读了一些利用这一点的示例,但我肯定无法使一个简单的hello word通过此功能生效。很抱歉,Java 8似乎在其日期类中添加了纳秒支持。我已更新了我的答案以反映这一点。希望您的应用程序正在Java 8上运行,以便您可以使用adv我从Java6改为Java8,但结果完全一样。
<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]