【问题标题】:.net core 3 not having ReferenceLoopHandling in AddJsonOptions.net core 3 在 AddJsonOptions 中没有 ReferenceLoopHandling
【发布时间】:2020-01-20 04:49:43
【问题描述】:

我的csproject文件显示:<TargetFramework>netcoreapp3.0</TargetFramework>

在我的启动即时通讯中使用以下内容:

 services.AddMvc(x => x.Filters.AddService<TransactionFilter>())
        .AddJsonOptions(options => options.JsonSerializerOptions... )

但是,ReferenceLoopHandling 在options.JsonSerializerOptions 中不可用。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="FluentNHibernate" Version="2.1.2" />
    <PackageReference Include="FullContact.Contacts.API" Version="1.0.3" />
    <PackageReference Include="Google.Cloud.Storage.V1" Version="2.3.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Cors" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.2.0" />
    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="5.5.0" />
    <PackageReference Include="MySql.Data" Version="8.0.17" />
    <PackageReference Include="piplclient" Version="5.0.9" />
    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.5.0" />
  </ItemGroup>

</Project>

【问题讨论】:

    标签: json asp.net-core


    【解决方案1】:

    作为improve the ASP.NET Core shared framework 工作的一部分,Json.NET 已从 ASP.NET Core 共享框架中删除。如果您的应用使用 Newtonsoft.Json 特定功能(例如 JsonPatch 或转换器),或者如果它使用 formatsNewtonsoft.Json 特定类型,则您的应用可能需要此参考。

    在 ASP.NET Core 3.0 项目中使用 Json.NET:

    添加对Microsoft.AspNetCore.Mvc.NewtonsoftJson的包引用。

    更新Startup.ConfigureServices 以调用AddNewtonsoftJson

    services.AddMvc()
    .AddNewtonsoftJson();
    

    这会设置 MVC 并将其配置为使用 Json.NET 而不是新的 API。 AddNewtonsoftJson 方法有一个重载,允许您像在 ASP.NET Core 2.x 中使用 AddJsonOptions 一样配置 Json.NET 选项。

    services.AddMvc()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings = new JsonSerializerSettings() { … };
    });
    

    参考:

    https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio#jsonnet-support

    https://stackoverflow.com/a/55666898/10201850

    【讨论】:

    • 第二部分应该是:services.AddMvc().AddNewtonsoftJson(options =&gt; options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
    • 这是一种方法 - 用 Newton 替换本机 .netcore 3.x 序列化程序并使用旧方法。问题是为什么新的序列化程序没有循环引用忽略选项。默认情况下,他们使用 JsonSerializerOptions.MaxDepth=0,这表示最大深度 64。如果您在对象图中有循环,它将崩溃 -(((。很奇怪。可能的想法是不要使用循环返回对象,并产生“已清理”(业务实体映射的结果)。
    【解决方案2】:

    截至 2020 年 3 月,默认 JSON 序列化程序不支持引用循环处理。

    为了处理该问题,您必须首先在 Nuget 包管理器中安装较旧的 JSON 序列化程序(用于较旧版本的 .NET Core)Microsoft.AspNetCore.Mvc.NewtonsoftJson

    用法很简单:

    services.AddMvc().AddNewtonsoftJson(o => 
    {
        o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
    

    如果您使用的是简单的 Web API,或者像这样:

    services.AddControllers().AddNewtonsoftJson(o => 
    {
        o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
    

    【讨论】:

    • 该问题与新 System.Text.Json 中支持的功能/行为有关。只是“添加旧库”不是这里寻求的答案。
    【解决方案3】:

    如上所述,您需要安装 Microsoft.AspNetCore.Mvc.NewtonsoftJsonMicrosoft.AspNetCore.SignalR.Protocols.Newtonsoft 包并使用 AddNewtonsoftJsonProtocol 为了仍然使用 Newtonsoft 而不是 System.Text.Json(ReferenceLoopHandling 尚不可用)

    对于 SignalR 会是

    services.AddSignalR().AddNewtonsoftJsonProtocol(p => 
    { 
        p.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    });
    

    【讨论】:

      【解决方案4】:
      1. 添加包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 版本 - 3.1.3

      2. services.AddMvc().AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);

      【讨论】:

      • 祝福你!在这里被困在 Pluralsight 课程中:)
      【解决方案5】:

      MvcNewtonsoftJsonOptions

      services.PostConfigure<MvcNewtonsoftJsonOptions>(o => 
      {
          o.SerializerSettings.ContractResolver = new MyCustomContractResolver()
          {
              NamingStrategy = new CamelCaseNamingStrategy()
          };
      
          o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2019-12-30
        • 2020-03-20
        • 2017-07-28
        相关资源
        最近更新 更多