2017-11-15 1 views
1

2017-10-26 13:32:11 Etc/GMT 형식의 날짜가 포함 된 JSON을 deserialize하려고합니다. NodaTimeJson.NETNodaTime.Serialization.JsonNet과 결합 할 때 이것을 지원하는 것으로 보입니다. 다른 두 패키지를 사용하여 JSON 직렬화 복원에이 예제를 확장 할 때 NodaTime.Serialization.JsonNet이 사용자 지정 날짜 형식으로 작업하도록 만들기

var date = "2017-10-26 13:32:11 Etc/GMT"; 

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    "yyyy'-'MM'-'dd HH':'mm':'ss z", 
    DateTimeZoneProviders.Tzdb 
); 

var result = pattern.Parse(date); 

그러나, 나는 그것이 동작하지 않습니다 : 난 단지 NodaTime 사용, 여기에 내가이 작업을 진행했다 StackOverflow에 대한 몇 가지 정보를 발견했다.

public class DateObj 
{ 
    public ZonedDateTime Date { get; set; } 
} 

void Main() 
{ 
    var date = "2017-10-26 13:32:11 Etc/GMT"; 
    var json = $"{{\"Date\": \"{date}\"}}"; 

    var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
     "yyyy-MM-dd HH:mm:ss z", 
     DateTimeZoneProviders.Serialization 
    ); 

    var settings = new JsonSerializerSettings(); 
    settings.ConfigureForNodaTime(pattern.ZoneProvider); 
    var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings); 
} 

을하지만 The value string does not match a quoted string in the pattern. Value being parsed: '2017-10-26^ 13:32:11 Etc/GMT'. (^ indicates error position.) 말을 마지막 줄에 예외가 발생합니다 : 독서 문서 및 기타 리소스에서, 나는 이것이 작동하도록되어 생각합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

사용해야합니까'DateTimeOffset' 오히려 노다 시간 '보다 입력 OffsetDateTime' : 내가 명시 적으로 오히려 DateTimeZoneProviders.Serialization보다, 여기 DateTimeZoneProviders.Tzdb을 사용하고 있음을 당신은 확실히 TZDB 식별자를 가지고 주어진 참고? 일반적으로 노다 시간 유형을 전적으로 고수 할 수 있다면 인생은 더 간단합니다. –

+0

아니요, 모든 유형을 사용할 수 있지만 차이가별로 없으며 다른 오류 만 표시됩니다. '값 문자열이 패턴의 인용 문자열과 일치하지 않습니다. 파싱되는 값 : '2017-10-26^13:32:11 Etc/GMT'. (^는 오류 위치를 나타냅니다.)'. ''''등이 없으며, 몇 가지 다른 유형 인 'OffsetDateTime'과'ZonedDateTime'을 사용하여 패턴의 몇 가지 변형을 시도했지만 오류는 동일하게 유지되었습니다. – TheQ

+0

값을'ZonedDateTime'으로 만들어 준다면, 제대로 작동 할 수 있어야합니다. ('OffsetDateTime'을 제안했을 때 나는 실제로 여러분의 가치에 오프셋이 아닌 시간대가 포함되어 있음을 발견하지 못했습니다.) 현재이 질문에 대한 접근 방식은 문제가 아닙니다. 현재 답변을 삭제하거나 질문을 "NodaTime.Serialization.JsonNet에서 사용자 지정 형식으로 작업하도록 만들기"또는 그에 대한 새로운 질문을 만들기로 변경했습니다. 나는 확실히 어떤 방법으로도 돕고 싶다 ... –

답변

2

현재 특정 ZonedDateTime 패턴을 만들고 있습니다.하지만 실제로 패턴을 Json.NET에 알려주지는 않았습니다.

이 사용하는 데 필요한 노다 시간 유형 인 경우, 당신이 모든 ConfigureForNodaTime를 호출하지 않는 것이 좋을 걸 - 즉 잘못된 패턴으로 ZonedDateTime 컨버터를 구성 때문입니다. 변환기를 대체하기 위해 code internal to NodaTime.Serialization.JsonNet이 있지만 지금은 노출되지 않습니다.

그냥하지만 ​​하나의 컨버터를 만들 간단 (어쩌면 우리는 ... 그렇게한다), 그리고에 대한 설정을 구성합니다

여기
var settings = new JsonSerializerSettings 
{ 
    DateParseHandling = DateParseHandling.None, 
    Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) } 
}; 

가 전체 프로그램의 맥락에서의 모습입니다 .

using Newtonsoft.Json; 
using NodaTime; 
using NodaTime.Serialization.JsonNet; 
using NodaTime.Text; 
using System; 

public class DateObj 
{ 
    public ZonedDateTime Date { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var date = "2017-10-26 13:32:11 Etc/GMT"; 
     var json = $"{{\"Date\": \"{date}\"}}"; 

     var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
      "yyyy-MM-dd HH:mm:ss z", 
      DateTimeZoneProviders.Tzdb 
     ); 

     var settings = new JsonSerializerSettings 
     { 
      DateParseHandling = DateParseHandling.None, 
      Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) } 
     }; 
     var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings); 
     Console.WriteLine(dateObj.Date); 
    } 
} 
+0

멋지다, 매력처럼 작동! 고마워요 :) – TheQ

관련 문제