jsonファイルにList<ISomething>
があります。をTypeNameHandling.All
(これはJSONファイルが手書きされているため使用できません)を使用せずに逆シリアル化する簡単な方法が見つかりません。カスタムJsonConverterでインターフェースのリストをデシリアライズするには?
リストの代わりにリスト のメンバーに属性[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
はIShape
は、これら2つの実装とのインタフェースであるList<IShape>
ある: ShapeRect
とShapeDxf
。
私はすでにjオブジェクトとしてアイテムをロードした後、実際のクラスは、プロパティPath
の存在かどうかを与えられた負荷にチェックJsonConverterサブクラスを作成しました:
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を適用することができますどのようにリストに?
ありがとうございました。あなたのクラスで
['JsonPropertyAttribute.ItemConverterType'](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) – kiziu
@kiziuありがとう!私はGoogleでそれを見つけることができませんでした... :( – TesX