使用网络 API 自定义属性更改 JSON 对 Pascal 大小写的响应
Change JSON response to Pascal case using web API custom attribute
我将 MVC 核心 webApi 的 JSON 响应从 "camelCase" 转换为 "pascalCase" 的自定义操作过滤器属性不起作用。
尝试使用:
services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());
但是,这种全局设置改变了对 Pascal 大小写的所有响应。我只想更改对 Pascal 大小写的有限 API 响应。
自定义 ActionFilterAttribute
:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
base.OnResultExecuted(context);
var objectResult = context.Result as ObjectResult;
if (objectResult != null)
{
objectResult.Formatters.Clear();
objectResult.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared));
}
}
}
并在 webApi 控制器中使用:
[CancelCamelCaseResolverConfiguration]
public class FrmMainSearchController : AtlasApiController<FrmMainSearchController>
{
/*Api*/
}
预期结果:
searchCriteria = [{Key: "xx", Value: "yy"}]
实际结果:
searchCriteria = [{key: "xx", value: "yy"}]
大功告成:您需要重写 OnActionExecuted()
方法 而不是 OnResultExecuted()
。
调用 OnResultExecuted()
过滤器方法时更改格式化程序为时已晚。
如何修复:
覆盖 OnResultExecuted
方法以便在结果执行之前更改格式化程序:
public override void OnResultExecuted(ResultExecutedContext context)
public override void OnActionExecuted(ActionExecutedContext context)
{
...
}
附带说明一下,您没有检查类型 JsonResult
。要使其与 Json()
或 JsonResult()
一起使用,您需要动态检查结果类型:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
switch(context.Result){
case JsonResult j:
var result = new ObjectResult(j.Value);
context.Result = result;
ChangeFormatting(result);
break;
case ObjectResult o:
ChangeFormatting(o);
break;
default:
return;
}
}
private void ChangeFormatting(ObjectResult result){
if (result == null){ return; }
result.Formatters.Clear();
result.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared)
);
}
}
我将 MVC 核心 webApi 的 JSON 响应从 "camelCase" 转换为 "pascalCase" 的自定义操作过滤器属性不起作用。
尝试使用:
services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());
但是,这种全局设置改变了对 Pascal 大小写的所有响应。我只想更改对 Pascal 大小写的有限 API 响应。
自定义 ActionFilterAttribute
:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
base.OnResultExecuted(context);
var objectResult = context.Result as ObjectResult;
if (objectResult != null)
{
objectResult.Formatters.Clear();
objectResult.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared));
}
}
}
并在 webApi 控制器中使用:
[CancelCamelCaseResolverConfiguration]
public class FrmMainSearchController : AtlasApiController<FrmMainSearchController>
{
/*Api*/
}
预期结果:
searchCriteria = [{Key: "xx", Value: "yy"}]
实际结果:
searchCriteria = [{key: "xx", value: "yy"}]
大功告成:您需要重写 OnActionExecuted()
方法 而不是 OnResultExecuted()
。
调用 OnResultExecuted()
过滤器方法时更改格式化程序为时已晚。
如何修复:
覆盖 OnResultExecuted
方法以便在结果执行之前更改格式化程序:
public override void OnResultExecuted(ResultExecutedContext context)public override void OnActionExecuted(ActionExecutedContext context) { ... }
附带说明一下,您没有检查类型 JsonResult
。要使其与 Json()
或 JsonResult()
一起使用,您需要动态检查结果类型:
public class CancelCamelCaseResolverConfigurationAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
switch(context.Result){
case JsonResult j:
var result = new ObjectResult(j.Value);
context.Result = result;
ChangeFormatting(result);
break;
case ObjectResult o:
ChangeFormatting(o);
break;
default:
return;
}
}
private void ChangeFormatting(ObjectResult result){
if (result == null){ return; }
result.Formatters.Clear();
result.Formatters.Add(new JsonOutputFormatter(
new JsonSerializerSettings()
{
Formatting = Formatting.None,
ContractResolver = new DefaultContractResolver()
}, ArrayPool<char>.Shared)
);
}
}