2017-04-02 5 views
1

ISO 8601에 따르면 json date 필드는 부분 데이터를 포함 할 수 있습니다. "YYYY" (년 전용) 또는 "YYYY-MM" (월 - 월 전용).Newtonsoft.Json 직렬화 지원 년 전용 날짜 필드가 있습니까?

class PartialDateContainter 
{ 
    public DateTime MyPartialDate { get; set; } 
} 

[Test] 
public void JustCheckJsonDates() 
{ 
    var serializationSettings = 
     new JsonSerializerSettings 
     { 
      DateFormatHandling = DateFormatHandling.IsoDateFormat, 
      DateTimeZoneHandling = DateTimeZoneHandling.Utc, 
      NullValueHandling = NullValueHandling.Ignore, 
      ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
      ContractResolver = new ReadOnlyJsonContractResolver(), 
      Converters = new List<JsonConverter> 
      { 
       new Iso8601TimeSpanConverter(), 
       new IsoDateTimeConverter() 
      } 
     }; 

    var ser = JsonSerializer.Create(serializationSettings); 

    var json = "{ \"MyPartialDate\": \"2005\" }"; 

    var shus = ser.Deserialize<PartialDateContainter>(new JsonTextReader(new StringReader(json))); 

    Assert.True(true); 
} 

나는 실종 뭔가 :

그러나, 다음 코드를 지원하기로했다 Json.NET deserializer를 사용하여 형식 오류가 발생합니다?

+0

년도 플러스 달 작품 (예를 들어' "2005-05"'), 단 세 날짜 만 실패 일했다 역 직렬화 (예 :''2005 ''). – Nitzankin

+0

@ Nkosi 아니, 아직 해결되지 않았어, 내 문제는 년 전용 날짜 형식입니다. – Nitzankin

+0

그러면 사용자 지정 변환기가 필요합니다. – Nkosi

답변

1

Does Newtonsoft.Json Serialization Support Year-Only Date Fields?

기본적으로 설정되지는 않습니다.

그러나 연도 데이터 필드를 지원하도록 구성 할 수있을만큼 유연합니다. 여기

참조하는 Json.Net 문서 Serializing Dates in JSON

If your dates don't follow the ISO 8601 standard, then the DateFormatString setting can be used to customize the format of date strings that are read and written using .NET's custom date and time format syntax .

다음의 간단한 예는

[TestClass] 
public class JsonNetDateSerializationTests { 
    [TestMethod] 
    public void JustCheckJsonDates() { 
     //Arrange 
     var settings = 
      new JsonSerializerSettings { 
       DateFormatString = "yyyy", //<-- for year only dates. all others should parse fine 
      }; 

     var json = "{ \"YearOnly\": \"2017\", \"YearMonth\": \"2017-04\", \"YearMonthDay\": \"2017-04-02\" }"; 
     var expected = 2017; 

     //Act 
     var actual = JsonConvert.DeserializeObject<PartialDateContainter>(json, settings); 

     //Assert 
     Assert.IsNotNull(actual); 
     Assert.AreEqual(expected, actual.YearOnly.Year); 
     Assert.AreEqual(expected, actual.YearMonth.Year); 
     Assert.AreEqual(expected, actual.YearMonthDay.Year); 
    } 

    class PartialDateContainter { 
     public DateTime YearOnly { get; set; } 
     public DateTime YearMonth { get; set; } 
     public DateTime YearMonthDay { get; set; } 
    } 
} 
+0

문자열이 ** 따라옵니다 * * ISO 8601 표준, 강제로 포맷 문자열에 피드 싶지 않아요. 모든 ISO 8601 표준 문자열을 구문 분석 할 수 있어야합니다. – Nitzankin

+0

@Nitzankin 그렇다면 Json.Net 프레임 워크의 제한 사항입니다. 이미 문제가 발생했는지 확인하십시오. 작성하지 않은 경우 개발자에게 알리십시오. – Nkosi

+0

@ Nitzankin, 심지어 형식을 제공하지 않으면'var dt = DateTime.Parse ("2005")'를 호출해도 형식 예외가 발생합니다. – Nkosi