gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:57:48 26 4
gpt4 key购买 nike

我想用自定义属性装饰我的类,并在我使用自定义 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 设置中实例化转换器,将一些行为注入(inject)我的自定义 JsonConverter 的构造函数如下所示。

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

我可以获取 textWriter 路径中的属性名称。我可以在有关元数据的文档中看到一些有趣的提示,但我找不到执行此操作的方法。

这是一个装饰类的例子:

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

最佳答案

JsonConverter 适用于类型,不适用于字段或属性。

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

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

关于c# - 我可以从自定义 JsonConverter 的 WriteJson 方法获取属性的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553028/

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