在来自的一点帮助下表现技巧 http://james.newtonking.com/json/help/index.html?topic=html/Performance.htm在 Json.NET 文档中,我整理了一种从远程资源下载/反序列化 JSON 的方法:
public async Task<T> GetJsonAsync<T>(string url)
{
using (var stream = await new HttpClient().GetStreamAsync(url))
{
using (var sr = new StreamReader(stream))
{
using (var jr = new JsonTextReader(sr))
{
return new JsonSerializer().Deserialize<T>(jr);
}
}
}
}
我想要一个返回 a 的非通用版本dynamic
。调用上面的方法GetJsonAsync<dynamic>(url)
有效,直到您尝试访问结果的动态属性,此时我得到:
'Newtonsoft.Json.Linq.JObject' does not contain a definition for '[MyProperty]'
我见过如何反序列化为动态 https://stackoverflow.com/questions/4535840/deserialize-json-object-into-dynamic-object-using-json-net来自字符串,但还没有看到直接从流执行此操作的工作示例,这会更好,因为它的内存效率更高。这可能吗?
事实证明这与 Json.NET 关系不大,更多的是与我对动态的理解有关(我很少使用动态)。感谢@Peter Richie,我发现GetJsonAsync<dynamic>
如果我将 MyProperty 显式转换为字符串,则确实有效。但我宁愿不必这样做。使用我原来的方法和实际工作端点 http://echo.jsontest.com/MyProperty/MyValue,这里有3种情况;只有最后一个有效:
var url = "http://echo.jsontest.com/MyProperty/MyValue"; // great testing site!
var x1 = await GetJsonAsync<dynamic>(url);
Assert.AreEqual("MyValue", x1.MyProperty); // fail!
dynamic x2 = await GetJsonAsync<dynamic>(url);
Assert.AreEqual("MyValue", x2.MyProperty); // fail!
dynamic x3 = await GetJsonAsync<ExpandoObject>(url);
Assert.AreEqual("MyValue", x3.MyProperty); // pass!
有了这些知识,我原始方法的非泛型重载如下所示:
public async Task<dynamic> GetJsonAsync(string url) {
dynamic d = await GetJsonAsync<ExpandoObject>(url);
return d;
}
用户可以这样做:
var x = await GetJsonAsync(url);
Assert.AreEqual("MyValue", x.MyProperty); // pass!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)