XML API 请求返回数组或子类的"d3p1"



Using Postman, C#, .NET Framework 4.7

我从Postman发出一个GET请求,内容接受设置为"application/xml",我的.NET Framework Web API将用XML响应(太棒了!(。 我不需要手动序列化任何东西,因为 .NET Framework 在我返回Request.CreateResponse(HttpStatusCode.OK, myResponse)时序列化我的响应对象。

但是,它似乎包括我不熟悉的额外内容,我想知道它们是否可以通过 Global.asax 设置或类似设置删除?

  • xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels"是我想删除的东西!
  • "d3p1"不是我在创建XML时遇到的。我可以以某种方式删除它吗?
  • 当某些内容为空时,会弹出<error i:nil="true" />。当它为空时,是否可以只是出现或不出现?

因此,XML 响应如下所示:

<SimpleResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels">
<error i:nil="true" />
<result>
<bookList xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.MyModels.Shared">
<d3p1:Book>
<d3p1:bookname>Book 1 Name</d3p1:bookname>
<d3p1:serial>ZMeTaQ1kejh0mJYGHE4+1a4Y2juU6tMDd5zYDqN4tqI=</d3p1:serial>
<d3p1:id>4</d3p1:id>
</d3p1:Book>
<d3p1:Book>
<d3p1:bookname>Hello World</d3p1:bookname>
<d3p1:serial>9lM16kho3bgsrG+wRh4ejtZjwrYJwp6FbRqnnZ4CJPA=</d3p1:serial>
<d3p1:id>5</d3p1:id>
</d3p1:Book>
<d3p1:Book>
<d3p1:bookname>Ding</d3p1:bookname>
<d3p1:serial>XCqqKB+Wi3i4z6nN1Ry8IHtar6ogojjiqxMfvfgC0qc=</d3p1:serial>
<d3p1:id>6</d3p1:id>
</d3p1:Book>
</bookList>
<author xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.Models.Android.Shared">
<d3p1:pictureId>0</d3p1:pictureId>
<d3p1:websiteurl i:nil="true" />
<d3p1:email i:nil="true" />
<d3p1:name>Jo Blogs</d3p1:size>
<d3p1:age>0</d3p1:size>
</author>
</result>
</SimpleResponse>

我的类看起来像这样:

public string error { get; set;}
public class SimpleResponse 
{
public List<Book> bookList { get; set; }
public Author author { get; set; }
}
public class Book
{
public string bookname { get; set; }
public string serial { get; set; }
public int id { get; set; }
}
public class Author
{
public string pictureId{ get; set; }
public string websiteurl { get; set; }
public string email { get; set; }
public string name { get; set; }
public int age { get; set; }
}

xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels"是我想删除的东西!
"d3p1"不是我在创建XML时遇到的。我可以以某种方式删除它吗?

属性:

  • xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels"
  • xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.MyModels.Shared"

都是 XML 命名空间声明。 第一个为 XML 文档建立默认的 XML 命名空间;第二个声明一个命名空间,所有以d3p1:开头的子元素都属于该命名空间。

从选择的特定命名空间来看,很明显您正在使用DataContractSerializer进行 XML 序列化。 此序列化程序根据数据协定名称:数据协定命名空间中记录的规则分配 XML 命名空间

默认情况下,任何给定的 CLR 命名空间(格式为 Clr.Namespace(都映射到命名空间 http://schemas.datacontract.org/2004/07/Clr.Namespace。若要重写此默认值,请将 ContractNamespaceAttribute 属性应用于整个模块或程序集。或者,若要控制每种类型的数据协定命名空间,请设置 DataContractAttribute 的 Namespace 属性。

由于您不需要任何类型的 XML 命名空间,因此第一个选项似乎是最简单的:将以下属性应用于程序集:

[assembly: ContractNamespaceAttribute("", ClrNamespace = "dto.MyModels")]
[assembly: ContractNamespaceAttribute("", ClrNamespace = "dto.MyModels.Shared")]
[assembly: ContractNamespaceAttribute("", ClrNamespace = "dto.Models.Android.Shared")]

或者,可以将数据协定属性应用于类型:

[DataContract(Name = "Book", Namespace = "")]
public class Book
{
[DataMember]
public string bookname { get; set; }
[DataMember]
public string serial { get; set; }
[DataMember]
public int id { get; set; }
}

请注意,数据协定序列化是选择加入的,因此您需要将[DataMember]应用于要序列化的每个成员。

作为最后一种选择,您可以切换到使用没有默认 XML 命名空间的XmlSerializer。 为此,您需要将[XmlSerializerFormat]应用于服务协定,如手动切换到 XmlSerializer中所示。

当某些内容为空时,会弹出<error i:nil="true" />。当它为空时,是否可以只是出现或不出现?

可以通过在引用类型数据成员上设置DataMemberAttribute.EmitDefaultValue来删除这些空元素,如本答案所示我可以将 DataContractSerializer 配置为不在输出 XML 中创建可选(即可为空<>和 List<>(元素吗?作者:Darren Clark:

[DataContract(Name = "Book", Namespace = "")]
public class Book
{
[DataMember(EmitDefaultValue = false)]
public string bookname { get; set; }
[DataMember(EmitDefaultValue = false)]
public string serial { get; set; }
[DataMember]
public int id { get; set; }
}

或者,您可以切换到默认情况下不输出空引用值的XmlSerializer

最新更新