【问题标题】:Using .Net standard project in asp.net core cause exception in json serialization在asp.net核心中使用.Net标准项目导致json序列化异常
【发布时间】:2021-07-05 11:04:34
【问题描述】:

我有一个作为 nuget 包分发的 .Net Standart 类库项目。 当我将此包用于 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”不包含“功能”的定义

当然,我阅读的 json 文件具有其“功能”属性,并且对于两个项目来说都是相同的 Json 文件。此代码使用相同的 Json 文件通过单元测试进行测试。

【问题讨论】:

  • 您有一个错误,可能是大小写错误。该字符串没有 features 属性。 JSON 区分大小写,因此 features 不会匹配 Features。这与 .NET Standard 毫无关系。 .NET Core 中的所有 NuGet 包都是 .NET Standard。发布 JSON 字符串。
  • same package and same code in a .Net Winform application works just finestring 是否相同? JSON.NET 和 .NET Core 都不是新的。在过去的 5 年中,这两种方法都被数十万开发人员使用。 JSON.NET 是自第一个版本以来 ASP.NET Core 中的默认序列化程序。如果存在这样的问题,人们会在几年前注意到并修复它
  • Json 文件是两个项目的相同 Json 文件。并且此代码使用相同的 Json 文件通过单元测试进行了测试。
  • 如果序列化程序设置正确,Features(大写的 F)也可以工作。但最终,每次你使用dynamic,都会有一只小猫死去。不要这样做,使用具体的类。
  • @PanagiotisKanavos 是的,我刚刚检查过,它需要是 10 岁以上的 v3.x,哎呀。

标签: c# asp.net-core json.net .net-standard


【解决方案1】:
dynamic jResult = JsonConvert.DeserializeObject(jsonString);

您希望 jResult 是一些匿名生成的 .net 类,其属性来自您的 json,但实际上只是将 JObject 转换为 dynamic。您可以访问 JObject 字段,例如:

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

【讨论】:

  • 我认为您错过了问题的重点。 JObject 实现了IDynamicMetaObjectProvider 接口,这意味着它实际上将jResult.features 处理为jResult["features"]
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多