Как не возвращать значение 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, то они не должны быть сериализованы и вообще отправлять клиенту?
Ответы
Ответ 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; }
}