как не вернуть значение 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
источник