【问题标题】:Configure ASP.NET Web API to send empty tags for null values配置 ASP.NET Web API 为空值发送空标签
【发布时间】:2012-12-02 17:04:26
【问题描述】:

我是 ASP.NET Web API 的新手。

我已将我的应用程序配置为使用 XMLSerializer 作为

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer
                                                                    = true;

为了简单起见,说我的控制器返回一个 Account 类的实例

public class Account
{
  public int AccountId {get;set;}

  public string AccountName {get;set;} 

  public string AccountNickName {get;set;}
}

AccountNickName(可选)有值时,我会得到这个 XML 响应

<Account>
 <AccountId>1</AccountId>
 <AccountName>ABAB</AccountName>
 <AccountNickName>My Account</AccountNickName>
</Account>

AccountNickName(可选)为 null

时,我将其作为 XML 响应
<Account>
 <AccountId>1</AccountId>
 <AccountName>ABAB</AccountName>
</Account>

如果值为 null,则 XML 输出会跳过 AccountNickName 标记。

我的问题是:

  1. 如何配置序列化程序以发送封闭标签而不是跳过属性

  2. AND 有没有办法在应用程序级别而不是在类级别进行配置

更新:

我知道您可以使用 JsonSerializerSetting 配置 JsonFormatter,您是否也可以使用 XMLSerializer 来实现这一点?

我不想在类上添加属性/装饰器。

【问题讨论】:

  • 这似乎是一种性能改进,而不是在性能上退后一步,我只是相应地调整我的客户。前提是您可以控制客户端。
  • 为什么客户关心空标签和自闭元素?
  • 这不是空的或自闭的。输出中不存在标签!

标签: web-services asp.net-web-api xmlserializer


【解决方案1】:

在这里做了一个快速测试,我发现如果你不这样做:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer                                                                   = true;

默认情况下,null 值将被序列化为实际元素。

您是否还有其他原因明确要配置它?将该值设置为“true”将导致 Web API 使用“XmlSerializer”而不是默认的“DataContractSerialier”类。

如果请求包含适当的“Content-Type”标头,表明需要 XML 响应,Web API 将为给定请求返回 XML。

【讨论】:

  • 是的,我不希望类上的 DataContract 属性,并且默认的 DataContractSerializer 正在将 dp4 命名空间添加到我的集合中。这里给出的示例有点简化
  • "我不想在类上使用 DataContract 属性" => 请注意 DataContractSerializer 支持 POCO 类型...
  • 即使我将此 mlserializer 添加为 true,它仍然不会返回 null xml 元素。
【解决方案2】:

如果你把它放在你的属性上,即使它为空,XmlSerializer 也会写出该属性:[XmlElement(IsNullable = true)]

public class Account
{
    public int AccountId { get; set; }
    public string AccountName { get; set; }

    [XmlElement(IsNullable = true)]
    public string AccountNickName { get; set; }
}

XML:

<Account xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <AccountId>123</AccountId>
    <AccountName>John Doe</AccountName>
    <AccountNickName xsi:nil="true"/>
</Account>

【讨论】:

  • 有没有办法在应用程序级别而不是在类级别进行配置?
  • 您可以使用XmlAttributesOverridesIsNullable 设置为true,然后将XmlAttributesOverrides 添加到config.Formatters.XmlFormatter.SetSerializer 中的序列化程序中,但这仅适用于您的属性不是原始类型(即AccountNickName 是您的代码 sn-p 中的字符串)。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2014-01-28
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多