2016-09-10 10 views
-2

これは私の質問HTTPClient Buffer Exceeded 2G; Cannot write more bytes to the bufferに関連していますが、IMOが別の質問をするのに十分です。NewtonSoft Json無効なキャスト例外

もう1つの質問では、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文と呼び出し元のラインとの間に、返されるオブジェクトはNewtonsoft.Json.Linq.JObjectにAPI_Json_Special_Feeds.RootMethodから変換されています。私はそれの間にコードがないので、私はそれをデバッグすることはできません。私がコールラインで再びキャストすると、「キャストできません」というエラーが表示されます。このオブジェクトタイプの劣化/変更を防止するにはどうすればよいですか?

多くの人があなたの時間、配慮、そしてあなたが提供できる考えや提案について考えています!あなたは、一般的な過負荷BinaryFormatterによって生成されたファイルとは異なりJsonSerializer.Deserialize<T>()

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

を使用する必要が

答えて

1

、JSONファイルは、一般的にC#の型情報が含まれていないので、期待されるタイプを指定するには、受信システムのために必要なのです。

(これはC#型情報にJSONファイルに含めることができJSON standardの拡張機能があります - 例えばJson.NETのTypeNameHandling - 。しかし、適切な明示的な基本クラスにJSONをデシリアライズすることが必要である)

ストリームから強く型付けされたC#オブジェクトを逆シリアル化する別の例については、Deserialize JSON from a fileを参照してください。

+0

ありがとうございました!これまでのところ、それは機能しません。私はそれがどこに詰まっているかを把握しようとしていて、報告するでしょう。エラーなし - 応答をロードし、何も返さない –

関連する問題