Подтвердить что ты не робот

Как не возвращать значение null, когда поле данных не установлено в контракте данных

У меня возникла странная проблема с моей службой WCF, которая возвращает данные в формате JSON. Я хочу вернуть информацию о "Клиенте" на основе запроса, отправленного клиентом.

Клиент может запросить, какие поля информации о клиенте они нуждаются, и службе необходимо отправить только эту информацию о клиенте.

Например: если клиент запрашивает список клиентов и говорит, что им нужно имя, фамилия, город каждого клиента, тогда сервер должен отправить ответ json с каждым именем поля и соответствующим значением

Что-то вроде...

[
  {"firstname":"john","lastname":"Goodman","city" :"NY"},
  {"firstname":"brad","lastname":"newman","city" :"LA"}
]

Если клиент запрашивает список клиентов с идентификационными и городскими полями, тогда ответ должен выглядеть так:

[
  {"id" :"1234","city" :"NY"},
  {"id":"1235","city" :"LA"}
]

Мой первоначальный проект заключался в том, чтобы внедрить класс "Клиент", а затем иметь каждое возможное "поле", как поле этого класса. Затем в моем методе обслуживания я получал список полей, заданных клиентом, и создавал объекты клиента только с установленными свойствами.

Мой контракт на работу выглядит следующим образом

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Customers?fields={value}")]
List<Customer> GetCustomers(string value);

Но проблема в том, что я украшаю класс "DataContract" и каждое поле "DataMember".... если некоторые свойства не заданы, они все равно десериализуются как NULL при отправке клиенту. Я не хочу, чтобы это произошло.

Кроме того, список возможных полей у клиента очень длинный, поэтому класс стал очень большим. Я предпочел бы хранить эти поля в качестве коллекции перечислений в моей службе, а не в полях класса.

Затем я подумал, что моя Операция вернет IDictionary<string,object>, а затем добавит каждое поле и значение итеративно в эту коллекцию. Это не сработало, потому что, когда словарь сериализуется, он показывает {"Key:dfas", "Value:34"} и т.д. И т.д. Не то, что я хочу

Итак, я немного застрял. Какой лучший способ решить эту проблему?

Можно ли пометить мой [DataContract] таким образом, что если [DataMember] свойства не установлены i.e, null, то они не должны быть сериализованы и вообще отправлять клиенту?

4b9b3361

Ответ 1

Вы можете пометить каждый элемент данных, чтобы он не был сериализован, если он равен нулю. Существенная часть: EmitDefaultValue = false

[DataContract]
public class Person
{
    [DataMember(EmitDefaultValue = false)]
    public string id { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string firstname { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string lastname { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public string city { get; set; }
}