2012-04-18 15 views
9

にキャストする方法JsonConvert.DeserializeObject<T>(string)を使用することができますが、キャストする特定のクラスを決定するためにオブジェクトの_type(最初のパラメータではないかもしれません)を覗き込む必要があります。 。基本的には、私がしたいことは次のようなものです:JSON.NetのJObjectをT

//Generic JSON processor for an API Client. 
function MyBaseType ProcessJson(string jsonText) 
{ 
    var obj = JObject.Parse(jsonText); 
    switch (obj.Property("_type").Value.ToString()) { 
    case "sometype": 
     return obj.RootValue<MyConcreteType>(); 
     //NOTE: this doesn't work... 
     // return obj.Root.Value<MyConcreteType>(); 
    ... 
    } 
} 
... 

// my usage... 
var obj = ProcessJson(jsonText); 
var instance = obj as MyConcreteType; 
if (instance == null) throw new MyBaseError(obj); 
+0

私は主に私ができることなら二回JSONを解析しないようにしたいのですことを指摘すべきです。 – Tracker1

+0

タイプ情報を持つJSONのどんなkinfを使用していますか? JSONは、プロパティと値のペアの表記です(値は配列またはプロパティ値のペアを含む別の型になります)。しかし、タイプ情報を持つJSONは見たことがありません。 "文字列化"してJSONにオブジェクトすると、すべての型情報が失われます。 – JotaBe

+0

@ JotaBeそれは私が取り組んでいるプロジェクトで使用するためのクライアントを構築している公開された安らかなAPIの一部です。 JSONを介してAPIを公開してすべてのレスポンスをオブジェクトにラップすると、一番外側のレスポンスは常にオブジェクト(エラー応答の場合でも)になり、そのオブジェクトで何らかの種類の情報が保持されます。クライアントレベルでの処理エラー対予期された応答の面では本当に役に立ちます... – Tracker1

答えて

24

最初にJSONをJObjectとして解析します。次に、LINQ to JSONを使用して_type属性を参照します。その後、値に応じて切り替えてToObject<T>を使用してキャスト:

var o = JObject.Parse(text); 
var jsonType = (String)o["_type"]; 

switch(jsonType) { 
    case "something": return o.ToObject<Type>(); 
    ... 
} 
+0

はこれを明日試します。 – Tracker1

+0

タイプがコンパイル時にわからない場合はどうなりますか? – Nuzzolilo

+3

@Nuzzolilo答えは、質問に指定されたシナリオを満足にカバーしています(コメントで明らかになっています)。あなたが来て5ヶ月後に追加した仮説シナリオではありません。でお寄せいただきありがとうございます。 – yamen

関連する問題