我已成功在我的类中应用JsonConverter
属性来管理过去用于对象属性的转换器。现在,我有一个包含多个DateTime
条目的字典,需要以不同的格式进行转换。例如,看看下面的字典:
var header = new Dictionary<string, object>
{
{"Id", reader.GetInt32(0)},
...
{"CreatedAt", reader.GetDateTime(4)},
...
{"StartDate", reader.GetDateTime(7)},
...
};
在序列化此词典时,我希望CreatedAt
采用不同的格式,StartDate
采用不同的格式。 CreatedAt
应具有完整的ISO格式,例如2014-05-26T09:13:34.56
和StartDate
应该只有日期,例如2014-05-26
。
告诉Json.NET如何格式化字典条目的首选方法是什么?
答案 0 :(得分:1)
这是一种可以做到的方法:
通过扩展Newtonsoft.Json.JsonConverter
抽象类来实现您自己的类型转换器。
public class DateOnly
{
public DateTime Date { get; set; }
}
Conveter class
public class DateOnlyConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is DateOnly)
{
writer.WriteValue(((DateOnly) value).Date.ToString("yyyy-MM-dd"));
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string value = reader.ReadAsString();
try
{
return DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture);
}
catch (FormatException)
{
return null;
}
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof (DateOnly);
}
}
添加仅限日期的类而不是DateTime struct
var header = new Dictionary<string, object>
{
{"Id", reader.GetInt32(0)},
...
{"CreatedAt", reader.GetDateTime(4)},
...
{"StartDate", new DateOnly { Date = reader.GetDateTime(7)}},
...
};
最后
string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter(), new DateOnlyConverter ());