wcf - 数据合约中未设置数据成员字段时如何不返回 null

标签 wcf json serialization datacontractserializer

我的 WCF 有一个奇怪的问题在 JSON 中返回数据的服务格式。
我想根据客户发送的请求返回有关“客户”的信息。

客户可以请求他们需要哪些客户信息字段,并且服务只需要发送有关客户的信息。

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

就像是...

[
  {"firstname":"john","lastname":"Goodman","city" :"NY"},
  {"firstname":"brad","lastname":"newman","city" :"LA"}
]

如果客户仅要求提供 ID 和城市字段的客户列表,则响应应如下所示
[
  {"id" :"1234","city" :"NY"},
  {"id":"1235","city" :"LA"}
]

我最初的设计是实现一个“客户”类,然后拥有每个可能的“字段”
作为这个类的一个领域。然后在我的服务方法中,我获取了客户端指定的字段列表,并仅使用这些属性集来实例化客户对象。

我的运营契约(Contract)是这样的
[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]未设置属性,即 null 那么它们不应该被序列化并发送给客户端吗?

最佳答案

您可以标记每个数据成员,使其在为空时不会被序列化。关键部分是: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; }
}

关于wcf - 数据合约中未设置数据成员字段时如何不返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5685045/

相关文章:

wcf - Rest vs Wcf的优缺点

javascript - JSON 字符串转义 - MathJax

asp.net - 将 C# 字符串数组序列化为 JSON 数组

java - Java 在 http 中发送 Protocol Buffer 的示例

c++ - 如何序列化结构并将其存储在 MySQL 数据库中?

asp.net-mvc - 领域实体、DTO 和 View 模型

wcf - 使用用户名通过 https 配置 WCF 以获得 WS-Security

wcf - ORM 抽象传统数据库加 WCF 服务

javascript + django - 类型错误 : X is undefined

ruby-on-rails - 将 Ruby 哈希转换为 JSON(无转义字符)