使用自定义 JsonConverter 反序列化接口列表?



我在 json 文件中有一个List<ISomething>,我找不到一个简单的方法 在不使用TypeNameHandling.All的情况下反序列化它 (我不想要/不能使用,因为 JSON 文件是手写的)。

有没有办法将属性[JsonConverter(typeof(MyConverter))]应用于成员 的名单而不是名单?

{
"Size": { "Width": 100, "Height": 50 },
"Shapes": [
{ "Width": 10, "Height": 10 },
{ "Path": "foo.bar" },
{ "Width": 5, "Height": 2.5 },
{ "Width": 4, "Height": 3 },
]
}

在本例中,Shapes是一个List<IShape>其中IShape是与以下两个实现器的接口:ShapeRectShapeDxf.

我已经创建了一个 JsonConverter 子类,它将项目加载为 JObject,然后在给定属性Path是否存在的情况下检查要加载哪个真实类:

var jsonObject = JObject.Load(reader);
bool isCustom = jsonObject
.Properties()
.Any(x => x.Name == "Path");
IShape sh;
if(isCustom)
{
sh = new ShapeDxf();
}
else
{
sh = new ShapeRect();
}
serializer.Populate(jsonObject.CreateReader(), sh);
return sh;

如何将此 JsonConverter 应用于列表?

谢谢。

在您的类中,您可以使用JsonProperty属性标记列表,并使用ItemConverterType参数指定转换器:

class Foo
{
public Size Size { get; set; }
[JsonProperty(ItemConverterType = typeof(MyConverter))]        
public List<IShape> Shapes { get; set; }
}

或者,您可以将转换器的实例传递给JsonConvert.DeserializeObject,假设您已经实现了CanConvert,以便在objectType == typeof(IShape)时返回 true。 然后,Json.Net 会将转换器应用于列表中的项。

相关内容

  • 没有找到相关文章

最新更新