BaseType が抽象クラスの場合、JsonConvert.Deserialize を使用して JSON データを IEnumerable
質問:
次の JSON について考えてみましょう:
<code>[ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email\u00a0protected]" }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email\u00a0protected]" } ]</code>
と次の抽象基本クラスおよび派生クラス:
<code>public abstract class BaseClass { public string Email; } public class ClassA : BaseClass { } public class ClassB : BaseClass { }</code>
JSON を次のように逆シリアル化しようとすると:
<code>IEnumerable<基类> deserialized;</code>
JsonConvert.Deserialize
解決策:
この問題を解決するには、JsonSerializerSettings の TypeNameHandling 設定を使用します。この設定を TypeNameHandling.All に設定すると、逆シリアル化された JSON に型情報が含まれます。
<code>JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string strJson = JsonConvert.SerializeObject(instance, settings);</code>
更新された JSON:
<code>{ "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib", "$values": [ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email\u00a0protected]", }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email\u00a0protected]", } ] }</code>
型情報を含めた後、逆シリアル化が正しく実行されるようになりました:
<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>
以上がBaseType が Abstract の場合、Newtonsoft JSON.NET を使用して JSON を IEnumerable に逆シリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。