1. ホーム
  2. c#

Newtonsoft JSON.NETでJSONをIEnumerable<BaseType>にデシリアライズする方法

2023-10-25 21:55:14

質問

このJSONが与えられた場合。

[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "[email protected]",
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "[email protected]",
  }
]

とこれらのクラスがあります。

public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}

JSONをどのようにデシリアライズすればよいのでしょうか。

IEnumerable<BaseClass> deserialized;

を使うことはできません。 JsonConvert.Deserialize<IEnumerable<BaseClass>>() という文句が出るので BaseClass が抽象的であると文句を言うからです。

どのように解決するのですか?

必要です。

JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

string strJson = JsonConvert.SerializeObject(instance, settings);

ということで、JSONは以下のようになります。

{
  "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
  "$values": [
    {
      "$id": "1",
      "$type": "MyAssembly.ClassA, MyAssembly",
      "Email": "[email protected]",
    },
    {
      "$id": "2",
      "$type": "MyAssembly.ClassB, MyAssembly",
      "Email": "[email protected]",
    }
  ]
}

そして、デシリアライズします。

BaseClass obj = JsonConvert.DeserializeObject<BaseClass>(strJson, settings);

ドキュメンテーション TypeNameHandlingの設定