我的WCF服务存在一个奇怪的问题,该服务以JSON格式返回数据。我想根据客户端发送的请求返回有关“客户”的信息。
WCF
JSON
客户可以要求他们需要哪些有关客户的信息,而服务只需发送有关该客户的信息。
例如:如果客户要求一个客户列表,并说他们想要每个客户的名字,姓氏,城市,则服务器应发送一个带有每个字段名称和对应值的json响应
就像是…
[ {"firstname":"john","lastname":"Goodman","city" :"NY"}, {"firstname":"brad","lastname":"newman","city" :"LA"} ]
如果客户仅要求提供具有ID和城市字段的客户列表,则响应应如下所示
[ {"id" :"1234","city" :"NY"}, {"id":"1235","city" :"LA"} ]
我最初的设计是实现一个“ Customer”类,然后将每个可能的“ field”作为该类的一个域。然后,在服务方法内部,我获得了由客户端指定的字段列表,并仅设置了那些属性来实例化客户对象。
我的运营合同看起来像这样
[OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Customers?fields={value}")] List<Customer> GetCustomers(string value);
但是问题是当我用“ DataContract”修饰类并且将每个字段设置为“ DataMember” …时。如果未设置某些属性,则在发送给客户端时它们仍会反序列化为NULL。我不希望这种情况发生。
另外,客户可能的字段列表很长,因此类别变得非常大。我宁愿将这些字段存储为服务中的枚举集合,而不是类的字段。
然后,我想到让Operation返回a IDictionary<string,object>,然后将每个字段和值迭代地添加到此集合。那是行不通的,因为当字典被序列化时,它会显示{"Key:dfas", "Value:34"}等,而不是我想要的
IDictionary<string,object>
{"Key:dfas", "Value:34"
所以我有点卡住了。解决此问题的最佳方法是什么?
我可以这样标记我[DataContract]的方式:如果[DataMember]未设置属性,即为null,则根本不应该将其序列化并发送给客户端?
[DataContract]
[DataMember]
您可以标记每个数据成员,以便它为null时不会被序列化。基本部分是:EmitDefaultValue = false
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; } }