我正在从文件中导入 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;
}
这适用于单个对象,不适用于数组。我可以设想重写它以使其与数组一起使用的方法,但所有这些都会导致它停止与单个对象一起使用。寻找最干净、最优雅的解决方案,让我拥有一个可以同时处理单个对象和该对象数组的转换器。