確かに -- この動作は自動的に行われます。重要なことは、BarClass にパラメーターのないコンストラクターがあることです (これは一般にシリアル化クラスにも共通していると思います)。JavaScriptSerializer の逆シリアル化メソッドは、オブジェクトの再構成に使用する型を受け取り、クラス内のすべてのサブタイプを処理します。
MSDN のドキュメントから: 「逆シリアル化中に、シリアライザーの現在の型リゾルバーが参照されます。これにより、配列内にネストされた要素とディクショナリ型を変換するときに使用するマネージド型が決定されます。その結果、逆シリアル化プロセスは、のすべてのネストされた要素を反復処理します。入力。"
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Program
{
private static void Main(string[] args)
{
var person = new Person();
person.Name = "reacher gilt";
person.Address = "100 East Way";
person.Age = 74;
person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
person.Bars = new List<BarClass>(new[]{
new BarClass("beep","boop"),
new BarClass("meep","moop"),
new BarClass("feep","foop"),
});
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonString = serializer.Serialize(person);
var rehydrated = serializer.Deserialize<Person>(jsonString);
}
}
class Person
{
public string Name { get; set; }
public string Address { get; set; }
public int Age { get; set; }
public List<string> Aliases;
public List<BarClass> Bars { get; set; }
}
class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
public BarClass() { }
public BarClass (string one, string two)
{
Sub_Property1 = one;
Sub_Property2 = two;
}
}
}
編集:ロブコーチの明確なコメントの後:
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Program
{
private static void Main(string[] args)
{
var person = new Person();
person.Name = "reacher gilt";
person.Address = "100 East Way";
person.Age = 74;
person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
person.Bars = new Dictionary<string, List<BarClass>>();
person.Bars.Add("items",
new List<BarClass>(new[]{
new BarClass("beep","boop"),
new BarClass("meep","moop"),
new BarClass("feep","foop"),
}));
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonString = serializer.Serialize(person);
var rehydrated = serializer.Deserialize<Person>(jsonString);
}
}
class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
public BarClass() { }
public BarClass (string one, string two)
{
Sub_Property1 = one;
Sub_Property2 = two;
}
}
class Person
{
public string Name { get; set; }
public string Address { get; set; }
public int Age { get; set; }
public List<string> Aliases;
public Dictionary <string, List<BarClass> >Bars { get; set; }
}
}
次のようなjsonを取得します。
{
"Aliases":
[
"teddy",
"freddy",
"eddy",
"Betty"
],
"Name":"reacher gilt",
"Address":"100 East Way",
"Age":74,
"Bars":
{
"items":
[
{
"Sub_Property1":"beep",
"Sub_Property2":"boop"
},
{
"Sub_Property1":"meep",
"Sub_Property2":"moop"
},
{
"Sub_Property1":"feep",
"Sub_Property2":"foop"
}
]
}
}
また、DataContractJsonSerializer を使用している人もいますが、これは実際にはjson にシリアル化する1 つの方法ですが、質問では System.Web.Script.Serialization.JavaScriptSerializer が指定されていました。