如何手动触发 JsonSerialization Error

How to manually trigger JsonSerialization Error

我有一个应用程序,在启动时,我注册了 NewtonSoft 并在序列化时记录了错误。当我检查我的应用程序日志时,我可以看到有错误日志,但我无法定位或重新创建错误。

错误:Failed during serialization: MoveNextAction.Method.ReturnTypeCustomAttributes

Startup.cs

.AddControllersAsServices().AddNewtonsoftJson(options =>
{
    options.UseMemberCasing();
    options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    options.AllowInputFormatterExceptionMessages = true;
    options.SerializerSettings.Formatting = Formatting.None;
    options.SerializerSettings.ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = null
    };
    options.SerializerSettings.Error = (sender, args) =>
    {
        _logger.LogError($"Failed during serialization: {args.ErrorContext.Path}", args.ErrorContext.Error);
        args.ErrorContext.Handled = true;
    };
})

我在我的申请中搜索了 serial

我也用DeserializeObject

JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonValue); 

我尝试将 jsonValue 设置为 null 但不幸的是,这并没有触发 SerializerSettings.Error。

任何有关生成 SerializerSettings 错误或调试的提示或建议都将不胜感激。

您可以通过传递与控制器参数中指定的模型 class 相比无效的 JSON 请求正文来实现。

定义一个带有 int 字段的模型 class,然后发送一个 HTTP 请求,在该字段的 JSON 中有一个字符串值。

这将作为默认值传递给控制器​​,在您的情况下,错误处理程序也应该被执行。

这是一个工作示例:

public class HomeController : Controller
{
    public class MyRequest
    {
        public int MyField { get; set; }
    }

    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    [HttpPost]
    public IActionResult Test([FromBody] MyRequest myRequest)
    {
        return Ok();
    }
}

如果你POST到/Home/Test值

{
    "MyField": "test"
}

那么你的错误处理程序将被调用,args.ErrorContext.Path 的值将是 MyField

尽管 args.ErrorContext.Error 的值将是 Message = "Could not convert string to integer: test. Path 'MyField', line 2, position 18." 我想我需要更深入地了解您的代码才能准确重现错误,但我希望这会有所帮助。

当您添加 .AddControllersAsServices().AddNewtonsoftJson... 时,它只会在您的操作输入和输出期间触发(实际上是在模型绑定和 return 操作结果中)。

因此,如果您想要在所有项目中触发 json 序列化错误,您必须在启动时明确设置 JsonSerializerSettings,如下所示:

var defaultJsonConvertSetting = new JsonSerializerSettings
            {
                Formatting = Formatting.None,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                ContractResolver = new DefaultContractResolver {NamingStrategy = null},
               
                Error = (sender, args) =>
                {
                    Console.WriteLine($"**********************Failed during serialization: {args.ErrorContext.Path}");
                    args.ErrorContext.Handled = true;
                }
                // other settings
            };

            JsonConvert.DefaultSettings = () => defaultJsonConvertSetting;

                .AddControllersAsServices().AddNewtonsoftJson(options =>
            {
                options.UseMemberCasing();
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.AllowInputFormatterExceptionMessages = true;
                options.SerializerSettings.Formatting = Formatting.None;
                options.SerializerSettings.ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = null
                };
                options.SerializerSettings.Error = (sender, args) =>
                {
                    _logger.LogError($"Failed during serialization: {args.ErrorContext.Path}", args.ErrorContext.Error);
                    args.ErrorContext.Handled = true;
                };
            });