Overriding the default JSON serializer settings for web API on application level has been covered in a lot of SO threads. But how can I configure its settings on action level? For example, I might want to serialize using camelcase properties in one of my actions, but not in the others.
JsonSerializerOptions() Initializes a new instance of the JsonSerializerOptions class. JsonSerializerOptions(JsonSerializerDefaults) Constructs a new JsonSerializerOptions instance with a predefined set of options determined by the specified JsonSerializerDefaults.
If you want JsonSerializer class to use camel casing you can do the following: var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy. CamelCase }; string json = JsonSerializer. Serialize(empList, options); return Ok(json);
JSON formatting is provided by the JsonMediaTypeFormatter class.
Specifies the settings on a JsonSerializer object.
At action level you may always use a custom JsonSerializerSettings
instance while using Json
method:
public class MyController : ApiController { public IHttpActionResult Get() { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var model = new MyModel(); return Json(model, settings); } }
You may create a new IControllerConfiguration
attribute which customizes the JsonFormatter:
public class CustomJsonAttribute : Attribute, IControllerConfiguration { public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) { var formatter = controllerSettings.Formatters.JsonFormatter; controllerSettings.Formatters.Remove(formatter); formatter = new JsonMediaTypeFormatter { SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; controllerSettings.Formatters.Insert(0, formatter); } } [CustomJson] public class MyController : ApiController { public IHttpActionResult Get() { var model = new MyModel(); return Ok(model); } }
Here's an implementation of the above as Action Attribute:
public class CustomActionJsonFormatAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext?.Response == null) return; var content = actionExecutedContext.Response.Content as ObjectContent; if (content?.Formatter is JsonMediaTypeFormatter) { var formatter = new JsonMediaTypeFormatter { SerializerSettings = { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; actionExecutedContext.Response.Content = new ObjectContent(content.ObjectType, content.Value, formatter); } } } public class MyController : ApiController { [CustomActionJsonFormat] public IHttpActionResult Get() { var model = new MyModel(); return Ok(model); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With