自动将 JsonConverter 属性应用于类型的所有属性

Fre*_*III 2 c# json.net converters

我的 ViewModel 中有一个用于DateTimeOffset属性的自定义 JsonConverter。我有 100 多个 ViewModel。

public class ItemViewModel 
{
  public string Name { get; set; }

  [JsonConverter(typeof(CustomDateTimeOffsetConverter))]
  public DateTimeOffset DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何将此属性应用于所有 DateTimeOffset 属性,而不将其添加到我的所有 ViewModel 中?

当我阅读此答案时,我以为我已经找到了解决方案,但是当我应用它时,CustomResolver 仅在父对象本身上触发,而不是在 DateTimeOffset 属性或任何属性上触发。

public class CustomResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (objectType == typeof(DateTimeOffset))
        {
            contract.Converter = new CustomDateTimeOffsetConverter();
        }
        return contract;
    }
}
Run Code Online (Sandbox Code Playgroud)

回顾一下,我已经完成了其他所有工作。如果我手动添加该[JsonConverter(typeof(CustomDateTimeOffsetConverter))]属性,那么我的应用程序就会像魅力一样工作。我只是问如何自动添加属性,而不是手动添加。

toa*_*akz 5

您需要将转换器添加到JsonSerializerSettings.Converters传递给序列化器的内容中。

您的JsonSerializerSettings意愿如下:

var settings = new JsonSerializerSettings()
{
    Converters =
            {
                new CustomDateTimeOffsetConverter()
            }
};
Run Code Online (Sandbox Code Playgroud)

您的自定义转换器还应该宣传它可以DateTimeOffset使用以下JsonConverter方法重写来转换类型:

public override bool CanConvert(Type objectType)
{
    return (objectType == typeof(DateTimeOffset));
}
Run Code Online (Sandbox Code Playgroud)