Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET Web API partial response Json serialization

I am implementing a Web API that supports partial response.

/api/users?fields=id,name,age

Given the class User

[JsonObject(MemberSerialization.OptIn)]
public partial class User
{
  [JsonProperty]
  public int id { get; set; }

  [JsonProperty]
  public string firstname { get; set; }

  [JsonProperty]
  public string lastname { get; set; }

  [JsonProperty]
  public string name { get { return firstname + " " + lastname; } }

  [JsonProperty]
  public int age { get; set; }
}

The Json formatter works great when serializing the all properties, but I can't manage to modify it at runtime to tell it to ignore some of the properties, depending on the query parameter "fields".

I am working with JsonMediaTypeFormatter.

I have followed http://tostring.it/2012/07/18/customize-json-result-in-web-api/ in order to customize the formatter, but I can't find any example on how to force the formatter to ignore some properties.

like image 279
Nicolas Faugout Avatar asked Apr 28 '26 20:04

Nicolas Faugout


2 Answers

Create your own IContractResolver to tell JSON.NET which properties need to be serialized. There's an example in official documentation you can take draw inspiration from.

like image 140
Nikola Radosavljević Avatar answered Apr 30 '26 09:04

Nikola Radosavljević


Just to add to the responses already here; I found a nuget package that does this for you

WebApi.PartialResponse

Git hub source code:
https://github.com/dotarj/PartialResponse

It essentially wraps the formatter discussed above, so that you only have to configure it like this:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new PartialJsonMediaTypeFormatter() { IgnoreCase = true });

Then, you can specify ?fields=<whatever> in your request, and it will return the model with only those fields specified.

like image 44
Alex Avatar answered Apr 30 '26 11:04

Alex



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!