.NET Framework4.6 And MVC5 JSON.NET Converter
初めに
deserialize to abstract class or interface
上記のerrorが出たとき、僕の実装は、JsonでBindするクラスのメンバーの中にabstractを指定してました。
たぶん仕組み
Jsonを既存のBindで行うと、abstractやらInterfaceで実装したら、クラスとしてはちゃんと構造があるわけではないので、Jsonをどんな風にシリアライズすればいいの変わらなくてエラーが出ちゃうわけですね?
- Newtonsoft.Json.NET を使ってます
サンプルコード
URL https://blog.codeinside.eu/2015/03/30/json-dotnet-deserialize-to-abstract-class-or-interface/ このサイトを参考にしました。
以下ソースもこのサイトの引用です。
Modelクラスの実装
public abstract class BaseFoo // 抽象クラス { public string FooBarBuzz { get; set; } } public class AFoo : BaseFoo // 実装 { public string A { get; set; } } public class BFoo : BaseFoo // 実装 { public string B { get; set; } }
Serializeテスト
AFoo a = new AFoo(); a.FooBarBuzz = "A"; a.A = "Hello World"; BFoo b = new BFoo(); b.FooBarBuzz = "B"; b.B = "Hello World"; List<BaseFoo> allFoos = new List<BaseFoo>(); allFoos.Add(a); allFoos.Add(b); var result = JsonConvert.SerializeObject(allFoos);
JsonConverterを実装
public class FooConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(BaseFoo)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); if (jo["FooBarBuzz"].Value<string>() == "A") return jo.ToObject<AFoo>(serializer); if (jo["FooBarBuzz"].Value<string>() == "B") return jo.ToObject<BFoo>(serializer); return null; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
実際に使ってみる
JsonConverter[] converters = { new FooConverter()}; var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings() { Converters = converters });
ってな感じで実装します。
簡単でしょ??
ばいん