2010-12-14 15 views
147

Newtonsoft JSON libraryをうれしく使っています。 例えば、私は(またはサブクラスではない場合があります)この場合には、.NETオブジェクトからJObjectから.NETへのオブジェクトを逆シリアル化する方法

if (result is Exception) 
    var jobjectInstance = JObject.FromObject(result); 

を例外のインスタンスをJObjectを作成することになり、今私は、ライブラリはJSONテキスト(つまり、文字列をデシリアライズすることができます知っています)

// only works for text (string) 
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

オブジェクトへのが、私が探していますは、次のとおりです。

// now i do already have an JObject instance 
Exception exception = jobjectInstance.???? 

まあ、私が上から行くことができることは明らかです10をJSONテキストに戻してからdeserialize機能を使用しますが、これは私にとっては逆のことです。

答えて

279

このpostによると、それは今より良いです:

// pick out one album 
JObject jalbum = albums[0] as JObject; 

// Copy to a static Album instance 
Album album = jalbum.ToObject<Album>(); 

ドキュメント:Convert JSON to a Type私はカスタムシリアル化の設定を渡すことができるように、むしろ速記よりも、このアプローチを使用するために必要な

+9

ここにパフォーマンスの影響に関するアイデアはありますか?反射は毎回使用されますか? –

+0

カスタムJsonConverterでこれを行うことは可能ですか? –

+1

ヒントありがとうございます。それは私をたくさん助けました。私は何かを追加してみましょう:私がタイプ 'T'を使用しているジェネリックメソッドでは、' result =(value is JObject)のようなものが必要でしたか? (注 - 'value'はJObjectなどのデータベースから来るオブジェクトです。その場合は結果になります) nullにする必要があります)。 – Matt

35

私はPersonのためのクラス定義は、以下に適合するものでなければならない。この

JObject o = new JObject(
    new JProperty("Name", "John Smith"), 
    new JProperty("BirthDate", new DateTime(1983, 3, 20)) 
); 

JsonSerializer serializer = new JsonSerializer(); 
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person)); 

Console.WriteLine(p.Name); 

を発見したドキュメントから:

class Person { 
    public string Name { get; internal set; } 
    public DateTime BirthDate { get; internal set; } 
} 

編集

あなたは最新のバージョンを使用している場合JSON.net のカスタムシリアル化は必要ありませんn、上記のTienDoの答えを見てください(またはあなたが私をupvote:P)、より簡潔です。

+1

。 –

関連する問題