2016-06-22 59 views
0

我有一個從HttpRequest返回的json字符串,我試圖反序列化到一個對象。 json的根元素在我的情況下是不需要的(其他應用程序使用相同的數據,因此無法刪除)。我嘗試了幾種不同的方式來做到這一點,但我的對象始終爲空。我可以在監視窗口中看到json正在從請求中正確返回。任何想法,我缺少什麼?Json.net - 反序列化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。我可以序列化成一個字典對象,並從那裏獲取我的值,但這似乎是一個只會包含一個節點的json字符串的很大開銷(x_banner) 我們有一個通用的方法,我們用於所有其他json所以我希望能夠重用它。現在,就這樣我沒有被卡住,我創建了一個新的方法並反序列化爲一個字典。 – Rhonda

回答

1

我看不出有任何理由不反序列化到一個Dictionary<string, BrandHeaderData>,然後設置

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

開銷應該是最小的

但是,如果由於某種原因,你要避免開銷,因爲您已經通過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流。