我有一个.Net Standart类库的项目,它以nuget包的形式分发。当我在Asp.Net Core项目中使用这个包时,我会得到一个内部异常(与Newtonsoft Json有关),而在.Net Winform应用程序中使用相同的包和相同的代码效果很好。抛出异常的方法的.Net标准代码是:
var jsonString = File.ReadAllText(jsonFilePath);
dynamic jResult = JsonConvert.DeserializeObject(jsonString);
foreach (dynamic feature in jResult.features)
{
...
}
例外情况是:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:"Newtonsoft.Json.Linq.JObject"不包含"features"的定义
当然,我读到的json文件有其"features"属性,对于两个项目都是相同的json文件。此代码通过使用相同Json文件的单元测试进行测试。
dynamic jResult = JsonConvert.DeserializeObject(jsonString);
您期望jResult是一些匿名生成的.net类,具有json中的属性,但实际上只是JObject
转换为dynamic
。您可以访问JObject字段,如:
var jResult = (JObject)JsonConvert.DeserializeObject(jsonString);
var features = (JArray)jResult["features"];
不幸的是,我还没有找到导致这种奇怪行为的原因,即.Net Standard中通过单元测试并在.Net Framework中运行良好的同一方法在.Net Core上引发了异常所以我把代码改为使用具体类而不是动态类,现在它在所有框架中都能很好地运行♂️