这与我的问题http://startssl.com有关但与IMO不同,它保证单独提出问题。
在另一个问题中,我试图找出如何处理破坏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。我无法调试它,因为它们之间没有代码。如果我再次在主叫线上施放,我会得到一个&#34;无法施放&#34;错误。如何防止此对象类型的降级/更改?
许多人认为您的时间,考虑以及您可以提供的任何想法或建议!
答案 0 :(得分: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反序列化为适当的显式基类。)
有关从流中反序列化强类型c#对象的另一个示例,请参阅Deserialize JSON from a file。