2014-08-06 5 views
1

Возможно ли настроить JSON.NET для сериализации/десериализации свойства по-разному, если он отмечен атрибутом?Пользовательская сериализация/десериализация DateTimeOffset на основе атрибута

public class Person { 
    [DateOnly] 
    public DateTimeOffset Birthday {get;set;} 
} 

public class Meeting { 
    public DateTimeOffset Date {get;set;} 
} 

Человек должен сериализовать в

{"Birthday": {"year": 1980, "month": 2, "day": 1}} 

собрания должны сериализации в

{"Date": "2012-12-31T21:03:54.735168+00:00"} 

ответ

3

Вы можете достичь этого путем написания пользовательских JsonConverter и декорирования Birthday свойства Person класса с ним. Что-то вроде этого:

public class DateTimeOffsetConverter : JsonConverter 
{ 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var val = (DateTimeOffset)value; 

     writer.WriteStartObject(); 
     writer.WritePropertyName("year"); 
     writer.WriteValue(val.Year); 
     writer.WritePropertyName("month"); 
     writer.WriteValue(val.Month); 
     writer.WritePropertyName("day"); 
     writer.WriteValue(val.Day); 
     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jObject = JObject.Load(reader); 

     var year = int.Parse(jObject["year"].ToString()); 
     var month = int.Parse(jObject["month"].ToString()); 
     var day = int.Parse(jObject["day"].ToString()); 

     existingValue = new DateTimeOffset(new DateTime(year, month, day)); 

     return existingValue; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(DateTimeOffset) == objectType; 
    } 
} 

Ваш Person класс должен выглядеть следующим образом:

public class Person 
{ 
    [JsonConverter(typeof(DateTimeOffsetConverter))] 
    public DateTimeOffset Birthday { get; set; } 
} 

и Meeting класс не должен быть изменен. Используя следующие строки, чтобы преобразовать объекты типа Person или Meeting вы получите желаемый результат:

var p = new Person 
{ 
    Birthday = DateTimeOffset.Now 
}; 

var m = new Meeting 
{ 
    Date = DateTimeOffset.Now 
}; 

var personString = JsonConvert.SerializeObject(p); 
var meetingString = JsonConvert.SerializeObject(m); 

Для десериализации Person объекта из personString можно использовать следующую строку:

var person = JsonConvert.DeserializeObject<Person>(personString); 
+1

+1 , Поскольку в первоначальном вопросе упоминалась десериализация, а также сериализация, было бы полезно показать реализацию метода ReadJson вместо того, чтобы бросать исключение NotImplementedException. –

Смежные вопросы