我可以从自定义JsonConverter的WriteJson方法获得属性上的属性吗?

本文关键字:属性 方法 自定义 JsonConverter WriteJson 我可以 | 更新日期: 2023-09-27 18:02:22

我想用自定义属性装饰我的类,并在自定义JsonConverter内使用json.net转换为json时读取它们。然后,我将根据这个自定义属性改变序列化。

public class MyCustomJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //I want to get any attributes set on the property here.
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Int64);
    }
}

另一种方法是使用属性在属性上指定我的自定义JsonConverter,但我不想这样做,因为我想通过在JsonSerializer设置中实例化转换器,将一些行为注入到我的自定义JsonConverter的构造函数中,如下所示。

String json = JsonConvert。SerializeObject(新的MyCLass()),新的JsonSerializerSettings{Converters = new List{新的MyCustomJsonConverter ()}});

我可以在textWriter路径中获得属性的名称。我可以在文档中看到一些关于元数据的有趣提示,但我找不到这样做的方法。

下面是一个装饰类的例子:

public class MyCustomAttribute : Attribute { }
public class MyCLass
{
    [MyCustom]
    public Int64 MyInt { get; set; }
}

我可以从自定义JsonConverter的WriteJson方法获得属性上的属性吗?

JsonConverters适用于类型,而不是字段或属性。

与其给使用现有类型的属性添加属性,不如考虑创建一个新类型并为其编写一个转换。

public struct MyCustomType
{
    ...
}
public class MyClass
{
    public MyCustomType {get; set;}
}

除此之外,你还想以其他方式序列化一个原始整数吗?如果整数表示某物,则为该物创建一个结构体或类。

参见:"ValueObject"(领域驱动设计的基本概念)

根据你下面的评论,另一种方法是忘记JsonConverters,简单地公开第二个属性:

public class MyClass
{
    [JsonIgnore]
    public Int64 MyInt {get; set;}
    [JsonProperty("MyInt")]
    public Int64 MyEncryptedInt
    {
        get { return Encrypt(MyInt); }
        set { MyInt = Decrypt(value); }
    }
}