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