6

オブジェクトから json への解析、およびその逆の解析中に、ナノ秒で作業するのに想像を絶する最悪の時間を過ごしました。Jackson の最も単純な使用法を作成しましたが、ナノ秒を取得できません。以下は私のデモンストレーションです。私のケースに関連するfasterxml FAQには、3つの重要な声明があります。最初の 2 つは、動作させるためのトリックを教えてくれます。3 番目は、使用しないように指示しますsql.Datesql.timestampsql.Date.

問題は次のとおりです。

まず、 まったく効果がmapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,true)ありません。、 、使用しなくても@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSSSSS")、使用してもしなくても結果は同じです。falsetruemapper.configure@JsonFormat

第 2 に、Deserialize のみを試みる場合、つまり、 に値2015-01-07 11:37:52.390452を入力してuser.json実行するだけでmapper.readValuevalue が取得される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 は絶対に使用しないでください。

//ポジョ

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]
4

1 に答える 1