2016-06-22 18 views
0

オブジェクトに逆シリアル化しようとしているHttpRequestから返されているJSON文字列があります。 jsonには、私の場合は不要なルート要素があります(同じデータを使用する他のアプリケーションでは、必要なので、削除できません)。私はこれを行うにはいくつかの異なる方法を試しましたが、私のオブジェクトは常にnullです。ウォッチウィンドウでjsonがリクエストから正しく返されていることがわかります。私は何が欠けているかについての任意のアイデア?JSONの逆シリアル化 - ルート要素の無視?

私のコードは以下の通りです。

ここに私のオブジェクトがあります。デシリアライズしようとしています。

public class BrandHeaderResponse 
{ 
    public BrandHeaderData brandHeaderData { get; set; } 
} 

public class BrandHeaderData 
{ 
    public dynamic Image { get; set; } //url and alt text 
    public string BackgroundColor { get; set; } 
    public string LiveText { get; set; } 
} 

は、ここでは、コード

HttpResponseMessage response; 
using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url))) 
{ 
    response = await webClient.SendAsync(request, requestHeaders); 
} 
using (var stream = await response.Content.ReadAsStreamAsync()) 
{ 
    using (var sr = new StreamReader(stream)) 
    { 
     using (var reader = new JsonTextReader(sr)) 
     { 
      var serializer = new JsonSerializer(); 
      var data = serializer.Deserialize<T>(reader); 
      return data; 
     } 
    } 
} 

そして最後に、ここでJSONがあります。

{ 
    "2000_banner":{ 
     "ComponentName":"2000_banner", 
     "SchemaName":"Brand Banner", 
     "BrandName":"Rockport - Dummy Banner", 
     "LogoTextColor":"Dark", 
     "Image":{ 
     "ImageUrl":"http://n.media.com/staging/24?w=153&h=64", 
     "AltText":"Burberry" 
     }, 
     "LiveText":"This is dummy brand text for Rockport.", 
     "BackgroundColor":"E3D9CE" 
     } 
    } 
+0

逆シリアル化したいルートオブジェクトのプロパティは、常に "" 2000_banner "'と命名されますか、またはプロパティ名が変更できますか? 2)ルートオブジェクトに他のプロパティがありますか? – dbc

+0

名前が変更されます。これはオブジェクトのIDに基づいています。私は辞書オブジェクトにシリアル化し、そこから自分の値を取得することができますが、これは1つのノード(x_banner)を含むjson文字列のオーバーヘッドが多いようです 私たちは他のすべてのjson私はそれを再利用できるようにしたいと思います。今のところ、私は立ち往生していないので、新しい方法を作成して辞書にデシリアライズしました。 – Rhonda

答えて

1

私はいくつかの理由のためにあなたはそれを避けたい場合はオーバーヘッドが、しかし

最小限にする必要があります

new BrandHeaderResponse { brandHeaderData = dictionary.Values.SingleOrDefault() }; 

を設定し、その後、Dictionary<string, BrandHeaderData>にデシリアライズしない何らかの理由が表示されませんオーバーヘッドは既にJsonTextReaderで読んでいるので、最初のネストされた値が見つかるまで、リーダーを使ってJSONストリームを繰り返し処理し、次の拡張メソッドを使用して逆シリアル化します。

public static class JsonExtensions 
{ 
    public static IEnumerable<T> DeserializeValues<T>(Stream stream) 
    { 
     var reader = new StreamReader(stream); // Caller should dispose 
     return DeserializeValues<T>(reader); 
    } 

    public static IEnumerable<T> DeserializeValues<T>(TextReader textReader) 
    { 
     var ser = JsonSerializer.CreateDefault(); 
     var reader = new JsonTextReader(textReader); // Caller should dispose 

     reader.SupportMultipleContent = true; 

     while (reader.Read()) 
     { 
      if (reader.Depth > 0 
       && reader.TokenType != JsonToken.None && reader.TokenType != JsonToken.Undefined && reader.TokenType != JsonToken.PropertyName) 
      { 
       yield return ser.Deserialize<T>(reader); 
      } 
     } 
    } 
} 

次に、DeserializeValues<BrandHeaderData>(stream).SingleOrDefault()を使用してJSONストリームを逆シリアル化します。

関連する問題