gpt4 book ai didi

c# - 覆盖 Json.NET 属性序列化/格式

转载 作者:太空狗 更新时间:2023-10-30 01:36:12 24 4
gpt4 key购买 nike

考虑以下类:

public class Person
{
[DisplayFormat(DataFormatString = "dd/MM/yyyy")]
public DateTime DOB { get; set; }
}

当使用 Json.NET 将对象序列化为 JSON 时,如果属性用 DisplayFormatAttribute 修饰,我想覆盖序列化。这应该有效地调用:

object toBeSerialized = DOB.ToString(attribute.DateFormatString)

有效地返回格式化字符串而不是 DateTime

使用 Json.NET 实现此目的的推荐方法是什么?

最佳答案

JsonConverter 类无权访问属性声明,因此它无法获取其装饰的属性。

此外,无法使用自定义 JsonConverter 装饰您的属性,也无法将其传递给您想要使用的日期格式,因为您应该传递类型 您要使用的 JsonConverter,而不是实例:

// This doesn't help us...
[JsonConverter(typeof(CustomDateTimeFormatConverter)]
public DateTime DOB { get; set; }

那我们怎么办呢?

为了将格式字符串传递给我们的 Converter,我们可以通过以下 ContractResolver(它可以通过反射访问属性信息)将其关联起来:

public class CustomDateTimeFormatResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);

// skip if the property is not a DateTime
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() });

关于c# - 覆盖 Json.NET 属性序列化/格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22858993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com