JsonConverter
类无法访问属性声明,因此无法获取其装饰的属性。
另外,没有办法使用自定义
JsonConverter
装饰属性,并传递您想要使用的日期格式,因为您应该传递您想要使用的JsonConverter的
类型,而不是实例:
// This doesn't help us...
[JsonConverter(typeof(CustomDateTimeFormatConverter)]
public DateTime DOB { get
那么我们该怎么做呢?
为了向我们的转换器传递格式字符串,我们可以通过以下ContractResolver
(它通过反射访问属性信息)进行关联:
public class CustomDateTimeFormatResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.PropertyType != typeof (DateTime))
{
return property;
}
var attr = (DisplayFormatAttribute)member.GetCustomAttributes(typeof(DisplayFormatAttribute), true).SingleOrDefault();
if (attr != null)
{
var converter = new IsoDateTimeConverter();
converter.DateTimeFormat = attr.DataFormatString;
property.Converter = converter;
}
return property;
}
}
这将在运行时将一个 IsoDateTimeConverter
转换器与我们自定义的 DateTimeFormat 关联到我们的日期时间,使用 DisplayFormat
属性中指定的格式。
为了告诉 Json.NET 使用我们的 ContractResolver,在序列化为 JSON 时需要使用以下语法:
string json = JsonConvert.SerializeObject(
p, Formatting.Indented,
new JsonSerializerSettings
{ ContractResolver = new CustomDateTimeFormatResolver() });