我在 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
是与以下两个实现器的接口:ShapeRect
和ShapeDxf
.
我已经创建了一个 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 会将转换器应用于列表中的项。