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

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

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

Учитывая 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; } } 

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

Я работаю с JsonMediaTypeFormatter.

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

Создайте свой собственный 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= в вашем запросе, и он вернет модель только с указанными полями.

Вы также можете условно сериализовать свойство, добавив логический метод с тем же именем, что и свойство, а затем префикс имени метода с помощью функции 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); } }