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

17

У меня возникла странная проблема с моей службой 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, то они не должны быть сериализованы и вообще отправлять клиенту?

    
задан user330612 16.04.2011 в 09:05
источник

1 ответ

41

Вы можете пометить каждый элемент данных, чтобы он не был сериализован, если он равен нулю. Существенная часть: 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; }
}
    
ответ дан Codo 16.04.2011 в 12:59
  • У меня все еще есть еще одна проблема, хотя ... общее количество возможных полей клиента - это большой вопрос ... как говорят 50 ... и поэтому я думал, есть ли лучший способ решить эту проблему чем иметь их в качестве свойств в классе ... любая идея? –  user330612 16.04.2011 в 18:55
  • '... и почему я не обнаружил этого 5 лет назад!' –  Simon_Weaver 28.09.2016 в 02:56