3

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.

3 Answers 3

4

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much @Nikola. I have spend the day on that web site, not watching for the good tutorials it seems ! I ended up creating a CustomContractResolver that accepts the list of properties to serialiaze in the constructor and it works great !
3

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.

Comments

1

You can also conditionally serialize a property by adding a boolean method with the same name as the property and then prefixed the method name with ShouldSerialize. The result of the method determines whether the property is serialized. If the method returns true then the property will be serialized, if it returns false and the property will be skipped.

public class Employee
{
  public string Name { get; set; }
  public Employee Manager { get; set; }

  public bool ShouldSerializeManager()
  {
      // don't serialize the Manager property if an employee is their own manager
      return (Manager != this);
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.