在Web API请求处理期间,是否存在等效于JsonSerializerSettings.MissingMemberHandling的XML序列化?

时间:2016-04-06 11:49:31

标签: c# asp.net-web-api xml-deserialization json-deserialization

我正在开发 ASP.NET Web API ,允许 XML和JSON格式用于其资源。我的某个Web API服务的资源模型类型具有用户不会发送的属性。但我必须将其设置为我发回的响应。

例如,有一个POST请求,用户希望将新项目保存到数据库。我的服务使用相同的资源模型和另一个属性来响应,表明它已保存。

我已将此附加属性添加到我的资源模型中。当我在Fiddler中测试传递XML请求时,它抱怨HTTP400说新属性丢失了。使用JSON输入,它工作正常,可能是由于默认的JSON设置JsonSerializerSettings.MissingMemberHandling

  

我们是否有与XML反序列化相同的属性?

示例输入XML:

<MyResource>
    <Property1>ABC</Property1>
    <Property2>DEF</Property2>
</MyResource>

我打算发送的示例输出XML:

<MyResource>
    <Property1>ABC</Property1>
    <Property2>DEF</Property2>
    <Id>123</Id>    
</MyResource>

错误看起来像:

The property Id was missing

我的资源模型如下:

public string Property1 { get; set; }
public string Property2 { get; set; }
public int Id { get; set; }

1 个答案:

答案 0 :(得分:1)

Microsoft的“JSON and XML Serialization in ASP.NET Web API”页面有关于XML序列化的说法(在XML序列化标题下):

  

如果需要对序列化进行更多控制,可以使用 DataContract 属性修饰类。如果存在此属性,则按如下方式对类进行序列化:

     
      
  • “选择加入”方法:默认情况下,属性和字段未序列化。要序列化属性或字段,请使用 DataMember 属性
  • 进行装饰   

DataMember属性具有以下property

  

<强> IsRequired
  获取或设置一个值,该值指示序列化引擎在读取或反序列化时必须存在该成员。

因此,从文档中可以看出,使用[DataMember(IsRequired=false)]装饰您的Id属性将允许XML Serializer允许它保持默认值。

但请注意,默认值为0,因此您需要明确检查该值是否为“无值”标记。如果要在逻辑上区分ID = 0的实体和 no ID的实体,请考虑将其类型更改为int?,因此默认值为null