如何手动触发 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
- 一对类具有[Serializable]属性
我也用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;
};
});
我有一个应用程序,在启动时,我注册了 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
- 一对类具有[Serializable]属性
我也用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;
};
});