2016-09-10 70 views
-2

這與我的問題HTTPClient Buffer Exceeded 2G; Cannot write more bytes to the buffer有關,但與IMO保證有其他問題不同。NewtonSoft Json無效鑄造異常

在另一個問題,我想弄清楚如何處理打破2G請求緩衝區。這個想法是使用流媒體,但我需要反序列化。在與Google教授交談時,我發現我必須使用TextReader進行流/反序列化。所以我的代碼是:

public async Task<API_Json_Special_Feeds.RootObject> walMart_Special_Feed_Lookup(string url) 
    { 
     special_Feed_Lookup_Working = true; 
     HttpClientHandler handler = new HttpClientHandler() 
     { 
      AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
     }; 
     using (HttpClient http = new HttpClient(handler)) 
     { 

      http.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip")); 
      http.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite); 
      url = String.Format(url); 
      using (var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) 
      { 
       Console.WriteLine(response); 
       var serializer = new JsonSerializer(); 

       using (StreamReader sr = new StreamReader(await response.Content.ReadAsStreamAsync())) 
       { 
        using (var jsonTextReader = new JsonTextReader(sr)) 
        { 
         API_Json_Special_Feeds.RootObject root = (API_Json_Special_Feeds.RootObject)serializer.Deserialize(jsonTextReader); 
         return root; 
        } 
       } 
      } 
     } 
    } 

現在,你可以看到,返回類型是強類型的。該方法的返回類型相匹配。現在,我去呼叫線路:

API_Json_Special_Feeds.RootObject Items = await net.walMart_Special_Feed_Lookup(specialFeedsURLs[i].Replace("{apiKey}", Properties.Resources.API_Key_Walmart)); 

因此,我們有匹配的類型周圍API_Json_Special_Feeds.RootMethod一路。

運行時,呼叫線路引發InvalidCastException:

令人失望的結果:

Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'RootObject' 

我已經在方法返回之前結束時檢查,結果確實是從投一個對象返回之前返回API_Json_Special_Feeds.RootMethod。

問題:某處return語句和主叫用戶線之間,被返回的對象正在從一個API_Json_Special_Feeds.RootMethod到Newtonsoft.Json.Linq.JObject轉換。我無法調試它,因爲它們之間沒有代碼。如果我再次在調用行中投射,則會出現「無法投射」錯誤。我怎樣才能防止這種對象類型的退化/改變?

許多人認爲你的時間,考慮和任何想法或建議,你可以提供!

回答

1

您需要使用泛型重載JsonSerializer.Deserialize<T>()

var root = serializer.Deserialize<API_Json_Special_Feeds.RootObject>(jsonTextReader); 

與通過BinaryFormatter生成的文件,JSON文件一般不包括C#類型的信息,因此有必要對接收系統來指定預期的類型。

(有擴展到JSON standard其中c#類型信息可以包括在一個JSON文件 - 例如Json.NET的TypeNameHandling - 但它仍然是必要的反序列化JSON到適當的明確的基類)

請參閱Deserialize JSON from a file有關從流中反序列化強類型化c#對象的另一個示例。

+0

謝謝!到目前爲止,這不起作用。我試圖找出它卡住的位置,並將回報。沒有錯誤 - 加載響應並從不返回任何內容 –