Частичный отклик Json для ASP.NET Web API

Я реализую веб-API, который поддерживает частичный ответ.

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

Учитывая класс пользователя

[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; }
}

Форматер Json прекрасно работает при сериализации всех свойств, но мне не удается изменить его во время выполнения, чтобы он игнорировал некоторые свойства в зависимости от параметра запроса "fields".

Я работаю с JsonMediaTypeFormatter.

Я следовал http://tostring.it/2012/07/18/customize-json-result-in-web-api/ для того, чтобы настроить форматтер, но я не могу найти пример того, как форсировать форматтер игнорировать некоторые свойства.

3 ответа

Решение

Создайте свой собственный IContractResolverсообщить JSON.NET, какие свойства нужно сериализовать. В официальной документации есть пример, из которого вы можете черпать вдохновение.

Просто чтобы добавить к ответам уже здесь; Я нашел пакет Nuget, который делает это для вас

WebApi.PartialResponse

Исходный код Git Hub:
https://github.com/dotarj/PartialResponse

По сути, он оборачивает форматтер, рассмотренный выше, так что вам нужно только настроить его следующим образом:

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

Затем вы можете указать ?fields=<whatever> в вашем запросе, и он вернет модель только с указанными полями.

Вы также можете условно сериализовать свойство, добавив логический метод с тем же именем, что и у свойства, а затем добавьте префикс имени метода с ShouldSerialize. Результат метода определяет, будет ли свойство сериализовано. Если метод возвращает значение true, свойство будет сериализовано, если оно возвращает значение false и свойство будет пропущено.

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);
  }
}
Другие вопросы по тегам