使用属性属性来定义要使用的 JsonConverter



我需要为使用特定属性装饰的属性指定JsonConverter,在本例中为 [DataType(DataType.PostalCode)] .

我已经有一个自定义JsonConverter,我已为其设置了CanConvert方法,如下所示:

public override bool CanConvert(Type objectType) => objectType == typeof(string);

如何确保在 API 遇到PostalCode属性时改用PostcodeJsonConverter

[DataType(DataType.PostalCode)]
public string Postcode { get; set; }

我已经尝试了以下内容,但我怀疑此时DataType属性不可用。

public override bool CanConvert(Type objectType) => 
    objectType == typeof(string) && 
    objectType.GetCustomAttributes(true)
              .OfType<DataTypeAttribute>()
              .Any(dta => dta.DataType == DataType.PostalCode);

我需要按如下方式装饰我的模型吗?

[DataType(DataType.PostalCode)]
[JsonConverter(typeof(PostcodeJsonConverter))]
public string Postcode { get; set; }
您可以

创建自定义ContractResolver,在每个属性上查找您的 DataType 属性并将值映射到相应的转换器。 以下是您需要的代码:

public class DataTypeResolver : DefaultContractResolver
{
    private Dictionary<DataType, JsonConverter> ConvertersByDataType { get; set; }
    public DataTypeResolver()
    {
        // Adjust this list to match your actual data types and converters
        ConvertersByDataType = new Dictionary<DataType, JsonConverter>
        {
            { DataType.PostalCode, new PostalCodeConverter() },
            { DataType.PhoneNumber, new PhoneNumberConverter() },
        };
    }
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member, memberSerialization);
        var att = prop.AttributeProvider.GetAttributes(true).OfType<DataTypeAttribute>().FirstOrDefault();
        if (att != null)
        {
            JsonConverter converter;
            if (ConvertersByDataType.TryGetValue(att.DataType, out converter))
            {
                prop.Converter = converter;
            }
        }
        return prop;
    }
}

然后通过以下设置将解析器传递给SerializeObject和/或DeserializeObject

var settings = new JsonSerializerSettings
{
    ContractResolver = new DataTypeResolver()
};
string json = JsonConvert.SerializeObject(yourObject, settings);

这是一个工作演示:https://dotnetfiddle.net/k1kWv5

您可以将转换器添加到 JsonSerializerSettings 中。因此,与其装饰所有内容,不如在那里添加邮政编码JsonConverter(取决于使用频率,装饰器可能会更好):

对于 aspnet 核心默认值:

services.AddMvc().AddJsonOptions(o => o.SerializerSettings.Converters.Add(new PostcodeJsonConverter()))

对于 JsonConvert:

JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
    Converters = { new PostcodeJsonConverter() }
});

相关内容

  • 没有找到相关文章

最新更新