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

时间:2014-05-08 21:39:23

标签: c# .net serialization attributes json.net

我想用自定义属性修饰我的类,并在我使用自定义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,但我不想这样做,因为我想通过实例化转换器中的转换器将一些行为注入到我的自定义JsonConverter的构造函数中JsonSerializer设置如下。

String json = JsonConvert.SerializeObject(new MyCLass(),new JsonSerializerSettings             {                 转换器=新列表                         {                             新的MyCustomJsonConverter()                         }             });

我可以在textWriter路径中找到属性的名称。我可以在关于元数据的文档中看到一些有趣的提示,但我无法找到实现此目的的方法。

以下是装饰类的示例:

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

1 个答案:

答案 0 :(得分:1)

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); }
    }
}