ジャクソンのシリアル化および逆シリアル化のDateTimeから/へのWCFのDateTime

Bilgehan:

私が使用してJacksonシリアライズとdeserialiseオブジェクトに。私が持っている.NET WCF DateTime JSONとフォーマットをTime Zoneそして、ジャクソンはdeserialiseことができないJSONオブジェクトに。私はいくつかの解決策を見つけましたが、任意のそこにあるJacksonことを行うためにどのように埋め込むか、提案された解決策は?

例日:

  • "/日付(+ 0000 12345678989)/"
  • "/日(12345678989-0000)/"

参照: パース.NETのDateTimeにJavaのDateオブジェクトにJSON文字列として受信方法

マイケルZiober:

生成された形式で日時を処理するために.NETJavaScriptSerializer形式で/Date(number of ticks)/カスタムデシリアライザを実装する必要があります。「ダニ」されているかを理解するには、を見てとることができますマニュアルを参照して

JSONで表される日付オブジェクト、「/日(ティック数)/」。ダニの数は真夜中1970年1月1日UTCからの経過ティック(ミリ秒)の数を示す正または負のlong値です。

サポートされる最大日付値がMaxValueを(12/31/9999 11時59分59秒PM)であり、サポートされる最小の日付値がMinValueプロパティ(1/1/0001午前12:00:00)です。

私はあなたのケースであなたはオフセットの例のように、うまくとして提供していることを、前提としています。

使用しJava 8 Timeたパッケージを、知識の上に、我々はプラス使用例以下のようにカスタムデシリアライザを実装することができます。

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.io.IOException;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        String inputJson = "{\"date\":\"/Date(1583001930882+0100)/\"}";

        ObjectMapper mapper = new ObjectMapper();
        Epoch epoch = mapper.readValue(inputJson, Epoch.class);
        System.out.println(epoch.getDate());
    }
}

class Epoch {

    @JsonDeserialize(using = JavaScriptDateDeserializer.class)
    private OffsetDateTime date;

    public OffsetDateTime getDate() {
        return date;
    }

    public void setDate(OffsetDateTime date) {
        this.date = date;
    }
}

class JavaScriptDateDeserializer extends JsonDeserializer<OffsetDateTime> {

    private final Pattern JAVASCRIPT_DATE = Pattern.compile("/Date\\((-?\\d+)([+-]\\d+)\\)/");

    @Override
    public OffsetDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getValueAsString();
        Matcher matcher = JAVASCRIPT_DATE.matcher(value);
        if (matcher.matches()) {
            String epoch = matcher.group(1);
            String offset = matcher.group(2);

            Instant instant = Instant.ofEpochMilli(Long.parseLong(epoch));

            return OffsetDateTime.ofInstant(instant, ZoneOffset.of(offset));
        }

        return null;
    }
}

上記のコードを印刷:

2020-02-29T19:45:30.882+01:00

シリアライザは、以下のようになります。

class JavaScriptDateSerializer extends JsonSerializer<OffsetDateTime> {

    @Override
    public void serialize(OffsetDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        StringBuilder builder = new StringBuilder(32);
        builder.append("/Date(");
        builder.append(value.toInstant().toEpochMilli());
        if (!value.getOffset().equals(ZoneOffset.UTC)) {
            builder.append(value.getOffset().toString());
        }
        builder.append(")/");

        gen.writeString(builder.toString());
    }
}

あなたは常に送信/で日付を受信した場合、適切にタイムゾーンを処理する必要がありUTCます。この部分をスキップすることができます。

参照してください:

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=19769&siteId=1