json 如何在ASP.NET Core 6 Web API中实现HttpPatch动作方法而不用NewtonSoft

hc2pp10m  于 2023-03-13  发布在  .NET
关注(0)|答案(1)|浏览(124)

昨天我把我的API升级到了. Net6,今天我想我也应该从Newtonsoft.Json迁移到System.Text.Json。
我做的第一件事是从我的项目中删除Microsoft.AspNetCore.Mvc.NewtonsoftJson包,我还从Startup.csservices.AddControllers()部分中删除了.AddNewtonsoftJson()语句。
然后,我将所有using Newtonsoft.Json;重命名为using System.Text.Json;,将所有[JsonProperty]装饰器重命名为[JsonPropertyName],等等。
我现在几乎没有错误了,但是我的HttpPatch动作方法遇到了一个障碍。“ModelState”类似乎是Microsoft.AspNetCore.Mvc.NewtonsoftJson的一个成员,我删除了它。我可以重新添加它,以及在Startup.cs中将.AddNewtonsoftJson()重新添加到services.AddControllers()。但这似乎是我试图实现的目标(即完全切断与Newtonsoft.Json的连接)的倒退。
这是VS显示的错误:
错误CS1503参数2:无法从“Microsoft.AspNetCore.Mvc.模型绑定.模型状态字典”转换为“系统.操作<Microsoft.AspNetCore.JsonPatch.JsonPatchError>”
关于如何让HttpPatch在不依赖Newtonsoft.json的情况下工作,您有什么想法吗?
我的HttpPatch操作方法如下所示:

[HttpPatch("{id:int}")]
public async Task<ActionResult<DocGroup>> PatchDocumentGroup([FromRoute] int id, [FromBody] JsonPatchDocument<DocGroup> patchDoc)
{
    if (patchDoc == null)
        return BadRequest(ModelState);

    var documentGroup = await _context.DocGroups.FindAsync(id);

    if (documentGroup == null)
    {
        return NotFound();
    }

    patchDoc.ApplyTo(documentGroup, ModelState);

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    await _context.SaveChangesAsync();

    return new ObjectResult(documentGroup);
}
nszi6y05

nszi6y051#

目前,ASP.NET Core不支持JSON Patch,而不支持Newtonsoft.Json,请从官方资料库中查看此问题。另一方面,您可以使用此方法添加对JSON Patch的支持(使用Newtonsoft.Json),同时保持其他输入和输出格式化程序不变:

builder.Services.AddControllers(options =>
{
    options.InputFormatters.Insert(0, MyJPIF.GetJsonPatchInputFormatter());
});
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.Options;

namespace JsonPatchSample;

public static class MyJPIF
{
    public static NewtonsoftJsonPatchInputFormatter GetJsonPatchInputFormatter()
    {
        var builder = new ServiceCollection()
            .AddLogging()
            .AddMvc()
            .AddNewtonsoftJson()
            .Services.BuildServiceProvider();

        return builder
            .GetRequiredService<IOptions<MvcOptions>>()
            .Value
            .InputFormatters
            .OfType<NewtonsoftJsonPatchInputFormatter>()
            .First();
    }
}

这样,NewtonsoftJsonPatchInputFormatter将处理JSON Patch请求,现有的基于System.Text.Json的输入和格式化程序将处理所有其他JSON请求和响应。

相关问题