Вы можете достичь этого путем написания пользовательских 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 , Поскольку в первоначальном вопросе упоминалась десериализация, а также сериализация, было бы полезно показать реализацию метода ReadJson вместо того, чтобы бросать исключение NotImplementedException. –