2017-04-02 53 views
1

根据ISO 8601 json日期字段可以包含部分数据,例如, "YYYY"仅限于年份或"YYYY-MM"仅适用于年份。Newtonsoft.Json序列化是否支持仅有的日期字段?

但是,下面的代码,使用Json.NET deserializer那是应该支持它,抛出一个格式错误:

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); 
} 

我缺少的东西?

+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

相关问题