2011-12-14 18 views
64

json.net(newtonsoft)
私はドキュメントを見ていますが、これを行う方法やこれを実行する最善の方法については何も見つかりません。Json.netは派生型をシリアル化/逆シリアル化しますか?

public class Base 
{ 
    public string Name; 
} 
public class Derived : Base 
{ 
    public string Something; 
} 

JsonConvert.Deserialize<List<Base>>(text); 

これで、派生オブジェクトが直列化リストに追加されました。どのようにしてリストを逆シリアル化し、派生型を返すのですか?

+0

これは継承の仕組みではありません。 JsonConvert.Deserialize (テキスト)を指定できます。名前フィールドを含める。 Derived **は** Baseであるため、BaseはDerivedの定義について何も知らない。 –

+0

申し訳ありませんが、少し明確になりました。問題は、基本オブジェクトと派生オブジェクトの両方を含むリストがあることです。ですから、newtonsoftに派生アイテムを逆シリアル化する方法を伝える方法を理解する必要があります。 – Will

+0

私はこれを解決しました。私は同じ問題を抱えている –

答えて

26

textにタイプを保存する場合(このシナリオの場合)、JsonSerializerSettingsを使用できます。

参照:how to deserialize JSON into IEnumerable<BaseType> with Newtonsoft JSON.NET

+14

'TypeNameHandling = TypeNameHandling.Auto'を使うこともできます - これは、宣言された型(つまり' Base')がインスタンス型と一致しないインスタンスに対してのみ '$ type'プロパティを追加します')。このようにして、JSONを 'TypeNameHandling.All'ほど膨らませません。 –

+0

私はJSON '...、...'で指定されたエラー解決型を受け取り続けます。パス '$ type'、行1、位置82.任意のアイデアですか? – Crasher

67

あなたはタイプ名の処理を有効にし、設定パラメータとして(デ)シリアライザにそれを渡す必要があります。

Base object1 = new Base() { name = "Object1" }; 
Derived object2 = new Derived() { something = "Some other thing" }; 
List<Base> inheritanceList = new List<Base>() { object1, object2 }; 

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; 
string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); 
List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings); 

これにより、派生クラスの正しい並べ替えが行われます。欠点は、使用しているすべてのオブジェクトに名前を付けることです。オブジェクトを置いているリストの名前を指定することになります。

+22

+1。あなたがSerializeObjectとDeserializeObjectのために同じ設定を使う必要があることが実際にわかるまで、私は30分間グーグルで行っていました。私は暗黙のうちに$ typeを使用すると仮定しました。 –

+14

'TypeNameHandling.Auto'もそれを行います。フィールド/プロパティの型に一致するときにインスタンス型の名前を書き込まないため、より良いです。ほとんどのフィールド/プロパティでよく使用されます。 –

+0

私の一日を保存していただきありがとうございます:) –

関連する問題