如何指定WebApi将序列化为哪个对象的名称?

时间:2012-08-09 14:48:36

标签: c# c#-4.0 serialization asp.net-web-api

我的web api返回一组与Domain对象不同的对象。例如,我的域名有一个Employee类,但我不想在api中公开Employee类的所有成员,所以我创建了另一个名为EmployeeApiModel的类。

现在我的WebApi正在返回一个EmployeeApiModel列表,但我希望能够指定它应该序列化到的名称。这不是xml中的<EmployeeApiModel>标记,我想获得<Employee>但不改变被序列化的基础类是EmployeeApiModel这一事实。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

从技术上讲,Web Api支持基于内容协商机制的json和xml,Json是默认格式,如果你想接收xml,只需加上标题:

  

接受:application / xml

要了解更多内容协商,请访问this

由于您希望api支持json和xml,因此您应该使用DataContract和DataMember属性对您的模型进行序列化:EmployeeApiModel,类似于:

[DataContract(Name = "Employee")]
public class EmployeeApiModel
{
    [DataMember(Name = "Name2")]
    public string Name { get; set; }

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

详情请见blog-post

答案 1 :(得分:0)

您可以使用各种属性标记来控制序列化XML的输出。

[XmlRoot("Employee")]
Public class EmployeeApiModel
{
    [XmlElement("fname")]
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int age { get; set; }
}

这将产生如下的XML:

<Employee>
    <fname>John</fname>
     <LastName >Smith</LastName >
    <age>24</age>  
</RootElementsName>

您可以在此处详细了解各种XML修饰符:http://msdn.microsoft.com/en-us/library/e123c76w

如果您想为JSON使用现有的XML修饰符,请查看以下帖子:Serialize .Net object to json, controlled using xml attributes