私が使用してJackson
シリアライズとdeserialiseオブジェクトに。私が持っている.NET WCF DateTime JSON
とフォーマットをTime Zone
。そして、ジャクソンはdeserialiseことができないJSON
オブジェクトに。私はいくつかの解決策を見つけましたが、任意のそこにあるJackson
ことを行うためにどのように埋め込むか、提案された解決策は?
例日:
- "/日付(+ 0000 12345678989)/"
- "/日(12345678989-0000)/"
生成された形式で日時を処理するために.NET
のJavaScriptSerializer形式で/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
ます。この部分をスキップすることができます。
参照してください: