【问题标题】:Replace ASP.NET Core 3.1 JSON implementation system wide替换 ASP.NET Core 3.1 JSON 实现系统范围
【发布时间】:2020-03-27 03:23:43
【问题描述】:

最近我决定从 ASP.NET Core 2.2 升级到 ASP.NET Core 3.1,并没有预料到所有的重大变化;我的应用程序的几乎每个部分都损坏了,因为大多数部分都依赖 JSON。

为了防止未来出现与 JSON 相关的问题,是否可以创建一个接口,模仿当前的 Json 实现并覆盖默认行为。

我的大部分代码都依赖于这两种方法:

Json.Serialize() // used in my razor 
Json() // returns an IActionResult

用例:Razor 页面:Json.Serialize Doc

<script>
   var myModel = @Html.Raw(Json.Serialize(Model))
</script>

用例:控制器

public async Task<IActionResult> AjaxGetRoleDetails(int id)
{
        return Json(await GetUserRoles(id));
}

当分别调用上述方法时,这是我想要的方法。

JsonConvert.SerializeObject() // override Json.Serialize
Content(JsonConvert.SerializeObject(), new MediaTypeHeaderValue("application/json")) // override Json()

如何覆盖系统实现,并调用我自己的实现 目前,当 ASP.NET 确定 JSON 实现时,可以轻松恢复到系统的实现。

【问题讨论】:

  • 不,这并不能回答问题,因为我能够找到该选项,我的问题是我所有的 json 字段最终都是小写的,并且可以很容易地转换每个方法调用.但由于这是一个糟糕的选择,我正在寻找一种拥有全局设置的方法。选项确实存在,但不完全清楚选项应该是什么。 DefaultContractResolver() 是保留大小写的方法,而 CamelCasePropertyNamesContractResolver 生成所有小写。这听起来很奇怪,因为它是。

标签: c# asp.net-core


【解决方案1】:

ASP.NET Core 的默认 JSON 序列化程序现在是 System.Text.Json

所以你可以migrate 继续使用它。

或者,如果您想在 ASP.NET Core 3.0 及更高版本中继续使用 Newtonsoft.Json,您可以update您的 Startup.ConfigureServices 调用 AddNewtonsoftJson。

如果您需要像以前一样的东西,例如,在 ASP.NET Core 2.2 中,那么您可以使用默认的合同解析器。例如

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

【讨论】:

  • 我有几个文件(+50)使用这个:@Html.Raw(Json.Serialize(Model)) 以及几个返回 Json(); 的语句在我的启动中,我已经在使用 .AddNewtonsoftJson();这对我没有全球影响。应该吗?
  • services.AddControllers().AddNewtonsoftJson();对 @Html.Raw(Json.Serialize(Model)) 没有影响;结果是所有字段都是小写的,当然可以想象这种变化的影响。
  • @Wayne 是的,据我所知,它应该是全球性的。我刚刚升级了一个带有 System.Text.Json 的 2.2 项目,导致了太多问题。此更改适用于我的整个项目。如何更新 Startup.cs 中的选项? .AddNewtonsoftJson(options =&gt; options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver());
  • @Wayne Also.. 根据doco 你安装了Microsoft.AspNetCore.Mvc.NewtonsoftJson 包吗?
  • Hmm.. 这个answer 怎么样?它说“有一个重载,允许您像在 ASP.NET Core 2.x 中使用 AddJsonOptions 一样配置 Json.NET 选项。” . IE。可能是默认的合约解析器:services.AddControllers() .AddNewtonsoftJson(options =&gt; { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多