ObjectMapperが日付型をLongに変更する理由

ガンヌス:

Jackson ObjectMapperを使用してオブジェクトからマップを取得しようとしています:

    ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
    Map<String, Object> map = oMapper.convertValue(obj, Map.class);

日付フィールドに問題があります。マップでは、それらがLongオブジェクトになっているためです。

ObjectMapperが日付を文字列に変更するように、デシリアライザを追加しました

public class ObjectMapperWithDate {
    @Bean
    public static ObjectMapper getObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.registerModule(
                new SimpleModule("foo")
                        .addDeserializer(Date.class, new DateDeserializer())
                        .addSerializer(Date.class, new DateSerializer())
        );
        return mapper;
    }
    public static class DateSerializer extends StdScalarSerializer<Date> {
        public DateSerializer() {
            super(Date.class);
        }
        @Override
        public void serialize(Date value, JsonGenerator gen, SerializerProvider provider)
                throws IOException {
            DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
            String output = formatter.format(value);
            gen.writeString(output);
        }
    }
    public static class DateDeserializer extends StdScalarDeserializer<Date> {
        public DateDeserializer() {
            super(Date.class);
        }
        @Override
        public Date deserialize(JsonParser p, DeserializationContext ctxt)
                throws IOException {
            try {
                DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
                return formatter.parse(p.getValueAsString());
            } catch (Exception e) {
                return null;
            }
        }
    }
}

もちろん、マッパーの呼び出しは少し異なります。

    ObjectMapper oMapper = ObjectMapperWithDate.getObjectMapper();
    Map<String, Object> map = oMapper.convertValue(obj, Map.class);

これで、Dateオブジェクトがマップ内のStringオブジェクトになります。日付が適切に表現されている。しかし、私はそれらを日付タイプのままにする必要があります興味深いのは、デシリアライザにブレークポイントを設定しても、到達しないことです。だから、デシリアライザに到達することは決してないだろう。シリアル化後のマッパーがSerializationFeature.WRITE_DATES_AS_TIMESTAMPSに応じてDateをStringまたはLongにし、デシリアライズ時にDateを認識しないためだと思います。

マッピング後に日付プロパティを日付プロパティのままにするにはどうすればよいですか?認められる必要があります。

ところで、BigDecimalプロパティはDoubleプロパティに変換されます。それは同様の問題のようですが、これらの2つのタイプは私の今後の作業にそれほど違いはありません。

amseager:

マップの値のタイプをとして定義したためObject、JacksonはタイプのカスタムデDateシリアライザーを選択せず、デフォルトのデシリアライザーを使用してすべてのタイプを基本的なタイプ(long、String、LinkedHashMapなど)に変換します。

Dateオブジェクトにフィールドしかない場合は、convertValueメソッドの2番目の引数を変更するだけです

Map<String, Date> map = oMapper.convertValue(obj, new TypeReference<Map<String, Date>>() {});

しかし、明らかにそれはあなたのケースではないので、異なるタイプのフィールドを持つオブジェクトに対してそれを行う最も簡単な方法は、デシリアライザのタイプをに変更し、Objectその中のすべてのデータを手動で解析することです:

    public static class DateDeserializer extends StdScalarDeserializer<Object> {
        public DateDeserializer() {
            super(Object.class);
        }
        @Override
        public Object deserialize(JsonParser p, DeserializationContext ctxt)
                throws IOException {
            String valueAsString = p.getValueAsString();
            try {
                DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
                return formatter.parse(valueAsString);
            } catch (Exception e) {
                //you could add extra logic to parse other types
                return valueAsString;
            }
        }
    }

また、の第一引数に置き換えることを忘れないでください.addDeserializerとしObject.class

それを行うためのよりエキゾチックな方法については、この記事を確認してください:http : //robertmarkbramprogrammer.blogspot.com/2018/05/de-serialise-json-string-to-map-with.html

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ObjectMapperは日付を文字列に変更します

分類Dev

日付をデータ時間型に変更する方法

分類Dev

文字列型の日付を日文字列に変更する

分類Dev

VBAが日付を月の最初の日に変更する

分類Dev

列を日付型に変換すると、元の値の年が変更されます

分類Dev

日付を数字に変更する

分類Dev

sqlliteに日付を挿入するときに文字列の日付をlongに変換する理由は何ですか?

分類Dev

ISO日付を短い日付のJavaScriptに変更する

分類Dev

PHPが新しい変数の日付に日を追加すると、他の変数が変更されます

分類Dev

jsが日時の日付部分を変更する瞬間

分類Dev

Android / Javaは文字列の日付をlong型に変換します

分類Dev

文字列を日付に変換し、その日付を変更する

分類Dev

SimpleDateFormat( "MM / dd / yyyy")が日付を10/20/20128に解析する理由

分類Dev

日付がミスアップしないように列のデータ型を変更するにはどうすればよいですか?

分類Dev

POSIXct日付値を毎週1日に変更する

分類Dev

MongoDBで日付文字列をLongに変換する

分類Dev

文字列としての日付を日付型に変換する方法

分類Dev

文字列の日付を日付データ型に変換する

分類Dev

ComboBox 1を変更するたびに、ComboBox2の日付が常に変更されます

分類Dev

変更は、long型の代わりに、タイムスタンプなどの日付を返すためにSpringbootにapplication.yaml

分類Dev

テキストを日付データ型に変換する

分類Dev

postgresSQLで数値型を日付に変換する

分類Dev

Intデータ型を日付に変換する

分類Dev

文字列を日付型に変換する

分類Dev

Javaで文字列の時刻を日付型に変換する

分類Dev

TSQLで「31/12/18」を日付型に変換する方法

分類Dev

Stata:文字列変数を日付に変更する方法は?

分類Dev

日付に基づいてjs変数値を変更する

分類Dev

セルに日付を書き込み、日付形式を変更する

Related 関連記事

  1. 1

    ObjectMapperは日付を文字列に変更します

  2. 2

    日付をデータ時間型に変更する方法

  3. 3

    文字列型の日付を日文字列に変更する

  4. 4

    VBAが日付を月の最初の日に変更する

  5. 5

    列を日付型に変換すると、元の値の年が変更されます

  6. 6

    日付を数字に変更する

  7. 7

    sqlliteに日付を挿入するときに文字列の日付をlongに変換する理由は何ですか?

  8. 8

    ISO日付を短い日付のJavaScriptに変更する

  9. 9

    PHPが新しい変数の日付に日を追加すると、他の変数が変更されます

  10. 10

    jsが日時の日付部分を変更する瞬間

  11. 11

    Android / Javaは文字列の日付をlong型に変換します

  12. 12

    文字列を日付に変換し、その日付を変更する

  13. 13

    SimpleDateFormat( "MM / dd / yyyy")が日付を10/20/20128に解析する理由

  14. 14

    日付がミスアップしないように列のデータ型を変更するにはどうすればよいですか?

  15. 15

    POSIXct日付値を毎週1日に変更する

  16. 16

    MongoDBで日付文字列をLongに変換する

  17. 17

    文字列としての日付を日付型に変換する方法

  18. 18

    文字列の日付を日付データ型に変換する

  19. 19

    ComboBox 1を変更するたびに、ComboBox2の日付が常に変更されます

  20. 20

    変更は、long型の代わりに、タイムスタンプなどの日付を返すためにSpringbootにapplication.yaml

  21. 21

    テキストを日付データ型に変換する

  22. 22

    postgresSQLで数値型を日付に変換する

  23. 23

    Intデータ型を日付に変換する

  24. 24

    文字列を日付型に変換する

  25. 25

    Javaで文字列の時刻を日付型に変換する

  26. 26

    TSQLで「31/12/18」を日付型に変換する方法

  27. 27

    Stata:文字列変数を日付に変更する方法は?

  28. 28

    日付に基づいてjs変数値を変更する

  29. 29

    セルに日付を書き込み、日付形式を変更する

ホットタグ

アーカイブ