如何在数据协定中未设置Data成员字段时,如何不返回null

use*_*612 18 wcf serialization json datacontractserializer

我的WCF服务有一个奇怪的问题,它以JSON格式返回数据.我想根据客户发送的请求返回有关"客户"的信息.

客户可以请求他们需要的客户的哪些信息领域以及仅发送有关客户的信息的服务需求.

例如:如果客户端要求客户列表并说他们想要每个客户的名字,姓氏,城市,那么服务器应该发送一个带有每个字段名称和相应值的json响应

就像是...

[
  {"firstname":"john","lastname":"Goodman","city" :"NY"},
  {"firstname":"brad","lastname":"newman","city" :"LA"}
]
Run Code Online (Sandbox Code Playgroud)

如果客户端仅询问具有ID和城市字段的客户列表,则响应应如下所示

[
  {"id" :"1234","city" :"NY"},
  {"id":"1235","city" :"LA"}
]
Run Code Online (Sandbox Code Playgroud)

我最初的设计是实现一个"客户"类,然后将每个可能的"字段"作为该类的一个字段.然后在我的服务方法中,我获取客户端指定的字段列表,并仅使用这些属性集实例化客户对象.

我的运营合同是这样的

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Customers?fields={value}")]
List<Customer> GetCustomers(string value);
Run Code Online (Sandbox Code Playgroud)

但问题是我用"DataContract"装饰类,每个Field为"DataMember"....如果没有设置某些属性,它们在发送到客户端时仍然会被反序列化为NULL.我不希望这种情况发生.

此外,客户的可能字段列表很长,所以课程变得非常大.我宁愿将这些字段存储为我的服务中的枚举集合而不是类的字段.

然后我想到让我的操作返回a IDictionary<string,object>然后迭代地将每个字段和值添加到此集合中.这不起作用,因为,当字典被序列化时,它显示{"Key:dfas", "Value:34"}等等而不是我想要的

所以我有点卡住了.解决这个问题的最佳方法是什么?

我可以这样标记[DataContract]如果[DataMember]没有设置属性,即null,那么它们不应该被序列化并发送给客户端吗?

Cod*_*odo 48

您可以标记每个数据成员,以便在它为空时不会被序列化.关键部分是: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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 我还有一个问题,但是...客户的可能领域总数没有多大......就像说50 ......所以我在想是否有更好的方法来解决这个问题而不是拥有它们作为班上的属性......任何想法? (3认同)