반응형
JSON.Net에 DateTime을 지정되지 않은 경우에도 Utc로 serialize하라고 할 수 있습니까?
내 데이터베이스의 날짜는 Utc로 저장됩니다.그러나 엔티티 프레임워크를 사용하여 검색하면 유형이 지정되지 않은 것으로 나타납니다.
JSON.Net에서 직렬화할 때 Utc 형식이 아닙니다.JSON.Net에 DateTimes 유형이 Utc로 지정되지 않은 경우에도 Utc로 직렬화하도록 지시할 수 있는 방법이 있습니까?
세트DateTimeZoneHandling에JsonSerializerSettings로.Utc그러면 모든 날짜가 직렬화되기 전에 UTC로 변환됩니다.
public void SerializeObjectDateTimeZoneHandling()
{
string json = JsonConvert.SerializeObject(
new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified),
new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
Assert.AreEqual(@"""2000-01-01T01:01:01Z""", json);
}
설명서:날짜 시간대 처리 »
위의 응답은 완전히 작동하기 때문에 API 응답을 PST에서 UTC로 변환하는 속성을 만들기 위해 사용했습니다.
처음에 저는 다음과 같은 작업을 수행해야 했습니다.JsonConverter
public class UTCDateTimeConverter : Newtonsoft.Json.JsonConverter {
private TimeZoneInfo pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
public override bool CanConvert(Type objectType) {
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
if (reader.Value == null) return null;
var pacificTime = DateTime.Parse(reader.Value.ToString());
return TimeZoneInfo.ConvertTimeToUtc(pacificTime, pacificZone);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc((DateTime) value, pacificZone));
}
}
그런 다음 변환이 필요한 속성에 적용해야 했습니다.
public class Order{
[JsonConverter(typeof(UTCDateTimeConverter))]
public DateTime OrderDate {get;set;}
}
@dez가 코멘트에서 언급했듯이 DateTime 객체를 DB에서 로드한 직후 그리고 직렬화하기 전에 직접 .net 코드에서 UTC로 "표시"할 수 있습니다.
var item = GetItemFromDb(...);
// mark appropriate DateTime fields manually as needed
item.OrderDate = DateTime.SpecifyKind(item.OrderDate, DateTimeKind.Utc);
// now it will be serialized to "2018-10-17T16:21:23.507Z" with the Z at the end
// and javascript will parse it properly and convert to local timezone as needed
뉴턴소프트의 구현을 기반으로 DateTime 속성을 위한 UTC 컨버터를 만드는 것이 더 간단했습니다.Json. Converters.IsoDateTimeConverter)입니다.
public class UtcJsonDateTimeConverter : DateTimeConverterBase
{
private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFZ";
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string text;
if (value is DateTime dateTime)
{
text = dateTime.ToString(DefaultDateTimeFormat, CultureInfo.InvariantCulture);
}
else
{
throw new JsonSerializationException(
$"Unexpected value when converting date. Expected DateTime or DateTimeOffset, got {value.GetType()}.");
}
writer.WriteValue(text);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
bool nullable = objectType == typeof(DateTime?);
if (reader.TokenType == JsonToken.Null)
{
if (!nullable)
{
throw new JsonSerializationException($"Cannot convert null value to {objectType}.");
}
return null;
}
if (reader.TokenType == JsonToken.Date)
{
return reader.Value;
}
else if (reader.TokenType != JsonToken.String)
{
throw new JsonSerializationException($"Unexpected token parsing date. Expected String, got {reader.TokenType}.");
}
string date_text = reader.Value.ToString();
if (string.IsNullOrEmpty(date_text) && nullable)
{
return null;
}
return DateTime.Parse(date_text, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
}
}
public class SomeEntity
{
[JsonProperty(PropertyName = "id", Order = 1)]
public int ID { get; set; }
[JsonProperty(PropertyName = "created", Order = 2)]
[JsonConverter(typeof(UtcJsonDateTimeConverter))]
public DateTime Created { get; set; }
}
기본 설정에 적용되지만 승인된 답변을 사용했습니다.
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
settings.Formatting = Formatting.Indented;
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
return settings;
});
언급URL : https://stackoverflow.com/questions/10302902/can-you-tell-json-net-to-serialize-datetime-as-utc-even-if-unspecified
반응형
'programing' 카테고리의 다른 글
| TorothyGit로 Git 분기를 삭제하려면 어떻게 해야 합니까? (0) | 2023.07.07 |
|---|---|
| 두 NS 날짜 사이의 빠른 날짜 (0) | 2023.07.07 |
| mongodbc# BSON 문서로 작업하는 방법 (0) | 2023.07.07 |
| '{}' 유형을 '기록' 유형에 할당할 수 없습니다. (0) | 2023.07.07 |
| ggplot gem_text 글꼴 크기 컨트롤 (0) | 2023.07.07 |