2011-09-04 11 views
7

私は、次のJSONは、JavaサービスからJSON.NETルートタグとデシリアライズ

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

を返してきたルートタグ「テスト」があるので、私は、しかし

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

次のC#クラスを持っています返された私は直接これを逆シリアル化することはできません

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

私は、別のこれが動作するためのクラス。これ以外の方法を避ける簡単な方法はありますか?

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

最後にもう1つ質問があります。私が呼んでいるサービスのほとんどはExceptionオブジェクトも返すことができます。オブジェクトを逆シリアル化する方法を決定するためにJSONの "ルート"タグを読んでいると思いました。どのようにして最初のルートタグを取得するのですか、またはサービスからの例外を処理するためのより優れた、より洗練されたメソッドがありますか?

おかげ

答えて

1

をしたくない場合あなたは匿名型を使用することができますラッパー型を作成する:

var test = 
    JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test; 

あなたは例外のように、複数のプロパティを持っている場合は、それがラッパー型を作成するために、おそらく良いでしょう。

1

単にラッパー書く:

public class Wrapper 
{ 
    public Test Test { get; set; } 
} 

をし、このラッパーにデシリアライズし、Testプロパティを通じてTestインスタンスを取得:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test; 
2

応答が実際にオブジェクトでありますTestオブジェクトが含まれています。したがって、あなたのオブジェクトモデルは同じに見えるはずです。そして、応答が例外を含めることができるので、あなたが反映している必要がありすぎていること:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

これは、あなたがExceptionは、次のようになりますかわからないを前提としています。その場合は、JObjectの代わりに具体的な型を使用します。 Exceptionnullかどうかに基づいてResponseオブジェクトを処理できます。

+0

私はそれを汎用オブジェクト(Testオブジェクト用)にすると実際にうまくいくかもしれないと思います。これは、1つまたは他のオブジェクトを解析する非常に簡単な方法です。ありがとうございました – Shaun

2

は同じ問題を抱えていたし、本当にこの「コンテナ」を取り除くしたい、あなたはルートオブジェクトを見つけるために余分な文字列を使用する必要があるものの、この解決策を見つけた:

// Container I wanted to discard 
public class TrackProfileResponse 
{ 
    [JsonProperty("response")] 
    public Response Response { get; set; } 
} 

// Code for discarding it 
var jObject = JObject.Parse(s); 
var jToken = jObject["response"]; 
var response = jToken.ToObject<Response>(); 
関連する問題