Не сериализуйте поля под внешними условиями C # - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно получить подмножество в ответе REST.Как я могу достичь этого?Например, у нас есть класс:

[DataContract]
public class Response
{
    [DataMember]        
    public string id { get; set; }
    [DataMember]
    public string href { get; set; }
    [DataMember]
    public string name { get; set; }
}

и переменная bool flag

В моем ответе мне нужны только поля href и id, если flag равно true.И если flag равно false, я должен вернуть все поля.

Мой метод GET реализован с помощью кода:

public interface IRestServiceImpl
{    
    [OperationContract]        
    [WebInvoke(Method = "GET",
         ResponseFormat = WebMessageFormat.Json,
         RequestFormat = WebMessageFormat.Json,
         BodyStyle = WebMessageBodyStyle.Bare,
         UriTemplate = "Response/{*id}?fields={fieldsParam}")]
}

Эта функция необходима для поддержки fields параметра запроса.

Я нашел атрибут EmitDefaultValue для не сериализации, но он работает только со значениями по умолчанию.

Должен ли я настроить сериализатор или атрибуты данных?

1 Ответ

0 голосов
/ 23 мая 2018

Это можно сделать с помощью Newtonsoft.https://www.newtonsoft.com/json/help/html/ConditionalProperties.htm

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