0

我正在从文件中导入 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;
}

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

4

0 回答 0