2012-03-12 35 views
3

我正在用新的Microsoft MVC 4 ApiController class and WebAPI构建RESTful Web服务。 我有一个Person类:更改ASP .NET MVC 4的内部对象的名称WebAPI序列化(XML/JSON)

public class Person 
{ 
    public string surname { get; set; } 
    public string name{ get; set; } 
} 

和默认的HTTP GET方法的工作,返回以下:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <surname>John</surname> 
    <name>Titor</name> 
</Person> 

我现在需要一个注解集,它可以让我改变默认的内部对象的名称,例如,我想将surname更改为msurname。我曾尝试加入以下内容:

[XmlElement("msurname")] 

注释,但只有当我的请求的Accept头包含application/xml(当然)的作品。我试过并使用了[DataMember]注释,这是完全忽略的。

是否有一个注释集可以在WebAPI中使用此ApiController进行XML和JSON格式的序列化?谢谢。

编辑:修正,如果我用[DataMember][DataContract]注释,我得到JSON序列化所需的行为,但不与XML。如果我使用[XmlElement],会发生相反的情况。

回答

5

您正在使用数据成员看到的行为是因为默认情况下的WebAPI使用XmlSerializer的,而不是DataContractSerializer的。不过,JSON目前默认使用JSONDataContractSerializer。但在未来它不会。您可以通过设置

GlobalConfiguration.Config.Formatters.XmlDataContractSerializer = true; 

这样改变XML的XmlDataContractSerializer,无论是JSON和XML格式将使用DataContractSerializer的。

+2

太好了,谢谢!我已经在我的'Global.asax.cs Application_Start'中放入了下面一行(与你所建议的不同):'GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseDataContractSerializer = true;' – frapontillo 2012-03-12 12:44:17

+0

顺便说一下,未来的默认行为? JSON会使用与XmlSerializer具有相同超类的序列化程序吗? – frapontillo 2012-03-12 12:54:24

+1

@MacGyver号他们正在寻找用JSON.Net替换默认的JSON序列化程序。但是,您始终可以将Formatters集合更改为仅使用所需的集合。 – 2012-03-12 14:00:45

0

两个串行确实使用不同的属性来处理列等

的重命名没有办法统一,你将需要有两个属性存在。

然而,您可以使用不同的XML/JSON序列化程序来识别其他属性。

UPDATE
您也可以尝试DataAnnotations,看看串行识别它们

+0

'[DisplayName(“msurname”)]'实际上没有改变,我仍然在XML和JSON序列化中都得到“姓氏”。 – frapontillo 2012-03-12 09:57:32

0

它的工作方式是,你将处理格式化程序。您获得的XML数据由XmlMediaTypeFormatterXmlMediaTypeFomatter Class)生成。

我没有意识到任何内置功能,但您可以很容易地编写自己的格式化程序。

这里是一个自定义的格式实现的例子,你会得到的想法:

Using JSON.NET with ASP.NET Web API

+0

是的,但我宁愿保持简单。我希望有一种由所有默认序列化器考虑的注释超类,因为默认的序列化系统是隐藏的。 – frapontillo 2012-03-12 10:08:51

+1

@MacGyver达雷尔米勒有一个更好的答案。 – tugberk 2012-03-12 11:46:59

相关问题