C# 如何将自定义JsonConverter应用于字典中的值?

C# 如何将自定义JsonConverter应用于字典中的值?,c#,json,dictionary,C#,Json,Dictionary,我正在尝试序列化和反序列化一个复杂的对象树,其中一些对象需要自定义JsonConverter。在属性是简单对象的情况下,将这样的转换器应用于对象属性很容易,但在属性是集合的情况下,我不知道如何应用这样的转换器 例如: [JsonObject(MemberSerialization.OptIn)] public class Settings { [JsonProperty] public Dictionary<string, Color> ColorSet; [Json

我正在尝试序列化和反序列化一个复杂的对象树,其中一些对象需要自定义JsonConverter。在属性是简单对象的情况下,将这样的转换器应用于对象属性很容易,但在属性是集合的情况下,我不知道如何应用这样的转换器

例如:

[JsonObject(MemberSerialization.OptIn)]
public class Settings
{
    [JsonProperty] public Dictionary<string, Color> ColorSet;
    [JsonProperty, JsonConverter(typeof(ColorConverter))] public Color CurrentColor;
}
[JsonObject(MemberSerialization.OptIn)]
公共类设置
{
[JsonProperty]公共字典颜色集;
[JsonProperty,JsonConverter(typeof(ColorConverter))]公共颜色CurrentColor;
}
Color是一种需要自己的JsonConverter的类型(仅供参考:这是Xamarin.Forms.Color,它不会从Json即时反序列化)

使用

Settings newSettings=JsonConvert.DeserializeObject(jsondata);
导致新的设置对象与正确初始化的CurrentColor对象。如何将相同的ColorConverter JsonConverter应用于颜色字典

同样的问题也适用于递归对象树:

[JsonObject(MemberSerialization.OptIn)]
public class DisplayPanel
{
    [JsonProperty] public List<DisplayPanel> Children;
}
[JsonObject(MemberSerialization.OptIn)]
公共类显示面板
{
[JsonProperty]公共列表子项;
}
其中DisplayPanel需要自己的JsonConverter


问题不是每个对象都是某个基类的(未知)派生类;Dictionary/List中的每个Color/DisplayPanel对象都有完全相同的类。

编写一个方法,迭代ColorSet Dictionary中的每种颜色,并对每种颜色调用JsonConvert.DeserializeObject()转换器。在初始化字典时调用此方法

编写一个方法,迭代颜色集字典的每种颜色,并对每种颜色调用JsonConvert.DeserializeObject()转换器。在初始化字典时调用此方法

最简单的方法可能是使用
[JsonConstructor]
标志,编写一个构造函数,以获取json数据并根据您的需要构造集合。请查看以下答案:。我认为解决方案是这样的,如所示。它也适用于集合项。感谢dbc,这正是最简单的方法,可以使用
[JsonConstructor]
标志并编写一个构造函数,以获取json数据并根据您的需要构造集合。请查看以下答案:。我认为解决方案是这样的,如所示。它也适用于集合项。感谢dbc,这正是它可能以这种方式工作的原因,但是迭代确实看起来不必要的笨拙。它可能以这种方式工作,但是迭代确实看起来不必要的笨拙
[JsonObject(MemberSerialization.OptIn)]
public class DisplayPanel
{
    [JsonProperty] public List<DisplayPanel> Children;
}