2016-12-05 11 views
1

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 }, 
    ] 
} 

ShapesIShapeは、これら2つの実装とのインタフェースであるList<IShape>ある: ShapeRectShapeDxf

私はすでに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を適用することができますどのようにリストに?

ありがとうございました。あなたのクラスで

+2

['JsonPropertyAttribute.ItemConverterType'](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonPropertyAttribute_ItemConverterType.htm) – kiziu

+0

@kiziuありがとう!私はGoogleでそれを見つけることができませんでした... :( – TesX

答えて

1

、あなたはJsonProperty属性であなたのリストをマークしItemConverterTypeパラメータを使用してコンバータを指定することができます。また

class Foo 
{ 
    public Size Size { get; set; } 

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

、あなたが実装されていると仮定すると、JsonConvert.DeserializeObjectにごコンバータのインスタンスを渡すことができますの場合にはtrueを返すように、CanConvertとなります。 Json.Netはコンバータをリストの項目に適用します。

関連する問題