在 asp.net 核心中使用 .Net 标准项目导致 json 序列化异常

Using .Net standard project in asp.net core cause exception in json serialization

我有一个 .Net Standart class 库项目,它作为 nuget 包分发。 当我将这个包用于 Asp.Net 核心项目时,我得到一个内部异常(与 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 class,具有您 json 的属性,但它实际上只是 JObject 转换为 dynamic。您可以像这样访问 JObject 字段:

var jResult = (JObject)JsonConvert.DeserializeObject(jsonString);
var features = (JArray)jResult["features"];

不幸的是,我还没有找到这种奇怪行为的原因,因为 .Net Standard 中通过单元测试并在 .Net Framework 中运行良好的相同方法在 .Net Core 上抛出了异常 所以我更改了代码以使用具体的 类 而不是动态的,现在它在所有框架中都运行良好 ‍♂️