Web API - 自我关闭标记而不是i:nil

ron*_*nen 7 c# datacontractserializer asp.net-web-api

我正在使用带有DataContract序列化的Web API .输出如下所示:

<Data>
<Status>
  <Date>2014-08-13T00:30:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T01:00:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T01:30:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T02:00:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
Run Code Online (Sandbox Code Playgroud)

通过执行以下操作,我能够删除所有额外的命名空间:

[DataContract(Namespace="")]
public class Status
Run Code Online (Sandbox Code Playgroud)

但剩下的唯一属性是i:nil属性.我该怎么做才能删除i:nil属性?

Yuv*_*kov 6

您需要EmitDefaultValueDataMember属性中设置属性

[DataMember(EmitDefaultValue = false)]
Run Code Online (Sandbox Code Playgroud)

请确保不要在已设置此属性的成员上设置此属性IsRequired = true

编辑

您还可以手动迭代 XML 并nil使用以下命令删除属性LINQ 2 XML

XNamespace i = "http://www.w3.org/2001/XMLSchema-instance";
        XDocument xdoc = XDocument.Load(@"XmlHere"); // This may be replaced with XElement.Parse if the XML is in-memory

        xdoc.Descendants()
                 .Where(node => (string)node.Attribute(i + "nil") == "true")
                 .Remove();
Run Code Online (Sandbox Code Playgroud)

  • 您的建议是正确的,但在 Web API 的情况下,您不能像这样操作 XML,它是内部序列化。 (3认同)

car*_*ira 4

您想要的是让代码“认为”它实际上有一个空字符串,而不是空值。您可以通过巧妙地使用属性获取器来做到这一点(见下文)。只需记住添加一条注释来解释为什么要这样做,以便其他维护代码的人知道发生了什么。

[DataContract(Namespace = "")]
public class Status
{
    [DataMember]
    public DateTime Date { get; set; }

    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Option { get; set; }

    private string value;

    [DataMember]
    public string Value
    {
        get { return this.value ?? ""; }
        set { this.value = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)