我是否需要一个单独的自定义 JsonConverter 对象和该对象的数组?

问题描述

我正在从文件中导入 Json。假设它看起来像这样

{
    "name": "Test System","devices": [
        {
            "type": "Touchpanel","name": "Main Touchpanel","id": "1","model": "TS-1070"
        },{
            "type": "display","name": "Front display","id": "2","hasscreen": false
        }
    ]
}

我要导入的类看起来像这样

class ConfigData
{
    [JsonProperty("devices")]
    [JsonConverter(typeof(ConfigConverter))]
    public IConfig[] Devices { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

ConfigConverter 是一个自定义的 JsonConverter,它检查“类型”并确定设备应该是什么 IConfig 实现。如果我只是反序列化单个设备,这非常有效,但是一旦我移动到一组设备,转换器就会给我一个错误。显然,一组设备的反序列化与单个设备的反序列化不同。

是否有一种本地方式可以说“对于此阵列中的每个设备,都使用此转换器”?或者我是否必须制作一个单独的自定义转换器来处理一系列设备。我不希望在多个客户转换器中使用本质上相同的代码

ConfigConverter 中的 ReadJson 如下所示

public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
{
    var jsonObject = JObject.Load(reader);
    var config = default(IConfig);
    switch (jsonObject["type"].Value<string>().ToLower())
    {
        case "display":
        config = new displayConfig();
        break;
        case "touchpanel":
        config = new TouchpanelConfig();
        break;
    }
    serializer.Populate(jsonObject.CreateReader(),config);
    return config;
}

这适用于单个对象,不适用于数组。我可以设想重写它的方法,以便它可以与数组一起使用,但是所有这些都会导致它停止使用单个对象。寻找最简洁、最优雅的解决方案,让我拥有一个转换器,可以同时处理单个对象和该对象的数组。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)