Частичный отклик 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, который делает это для вас
Исходный код 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);
}
}