programing

강제 JSONNET: DateTime을 시리얼화할 때 밀리초 포함(ms 구성 요소가 0인 경우에도)

instargram 2023. 2. 26. 09:01
반응형

강제 JSONNET: DateTime을 시리얼화할 때 밀리초 포함(ms 구성 요소가 0인 경우에도)

JSON을 쓰고 있어요.NET: 객체인스턴스에서 직접 Date Time 값을 시리얼화합니다(Date Time을 사용하지 않음).ToString()과 포맷터).

JSON을 강제하는 방법이 있나요?NET은 Date Time의 밀리초 성분이 0인 경우에도 시리얼라이제이션에 밀리초를 포함합니까?

배경:이 JSON 엔드포인트의 웹 서비스 소비자가 매우 느립니다.조건부 로직은 소비자에게 비용이 많이 들기 때문에 매번 같은 데이터 포맷을 제공하고 싶습니다.

이번 프로젝트에서도 같은 문제에 부딪혔어요.Web API(그리고 JSON)를 사용하고 있습니다.Net)를 사용하여 REST API를 구현합니다.우리가 발견한 건, 연재할 때DateTime오브젝트, JSON.Net은 밀리초에서 후행 제로를 생략하거나 제로일 경우 날짜에서 밀리초를 완전히 생략합니다.클라이언트는 밀리초 동안 정확히 3자리의 고정 길이의 날짜-시간 문자열을 예상하고 있었습니다.에서 다음과 같이 수정했습니다.Application_Start():

JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings;
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" 
};
settings.Converters.Add(dateConverter);

웹 API를 사용하지 않는 경우 동일한 작업을 수행할 수 있습니다.JsonSerializerSettings, 추가IsoDateTimeConverter위의 그림과 같이 시리얼라이저 설정을 전달합니다.JsonConvert.SerializeObject().

주의: 를 시리얼화하는 경우DateTimeOffset또는 로컬DateTime시간대 오프셋을 포함하려면 따옴표를 바꿉니다.'Z'따옴표 없이 상기의 형식으로K상세한 것에 대하여는, 메뉴얼의 「커스텀 날짜시각 형식 문자열」을 참조해 주세요.

이 답을 찾아 그러한 해석을 원하는 Java 사용자를 위해.NET 디폴트 형식의 타임스탬프. Java 8을 주목하고 싶습니다.java.time.*) 형식을 해석하는 방법:

public static final DateTimeFormatter FORMATTER =
    new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss")
                                  .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
                                  .toFormatter();
...
LocalDateTime ldt = LocalDateTime.parse(dateString, FORMATTER);

이것은 0 ~ 3 자리수의 프랙셔널 밀리초를 상정하고 있습니다.true예상되는 소수점 이하에 대해서.예를 들어 ".47"을 470밀리초로 올바르게 해석합니다.

JsonWriter를 사용할 때 이 문제가 발생했는데, Day.js 등의 Javascript 날짜 라이브러리가 3자리 숫자보다 밀리초를 선호한다는 것을 알게 되었기 때문에 해결해야 했습니다.이 질문으로 인해 해결 방법을 알게 되었기 때문에 다른 사람들이 저와 같은 사용 사례를 가지고 있는 경우를 대비해서 공유하려고 생각했습니다.

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw)) {
    writer.Formatting = Newtonsoft.Json.Formatting.None;
    writer.DateFormatString="yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff''";
    writer.WriteStartObject();

    DateTime? date = new DateTime(2021,12,30,23,59,40,250);
    writer.WritePropertyName("Date1");
    writer.WriteValue(date);

    date = new DateTime(2021, 12, 30, 23, 59, 40, 555);
    writer.WritePropertyName("Date2");
    writer.WriteValue(date);

    date = new DateTime(2021, 12, 30, 23, 59, 40, 0);
    writer.WritePropertyName("Date3");
    writer.WriteValue(date);

    date = null;
    writer.WritePropertyName("DateNULL");
    writer.WriteValue(date);
    writer.WriteEndObject();
}
Console.WriteLine(sb.ToString());

그 결과, 다음과 같이 됩니다.

{
    "Date1": "2021-12-30T23:59:40.250",
    "Date2": "2021-12-30T23:59:40.555",
    "Date3": "2021-12-30T23:59:40.000",
    "DateNULL": null
}

제가 추가해야 할 중요한 행은 다음과 같습니다.

writer.DateFormatString="yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff''";

언급URL : https://stackoverflow.com/questions/18193281/force-json-net-to-include-milliseconds-when-serializing-datetime-even-if-ms-com

반응형