Изменить имя внутренних объектов для сериализации ASP .NET MVC 4 WebAPI (XML / JSON) - PullRequest
3 голосов
/ 12 марта 2012

Я создаю веб-службу RESTful с новым классом Microsoft MVC 4 ApiController и WebAPI . У меня есть класс Person:

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], которая полностью игнорируется.

Существует ли набор аннотаций, который я могу использовать с этим ApiController в WebAPI для сериализации в форматы XML и JSON? Спасибо.

EDIT : исправление, если я использую аннотации [DataMember] и [DataContract], я получаю желаемое поведение с сериализацией JSON, но не с XML. Если я использую [XmlElement].

, происходит обратное

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

Поведение, которое вы видите с DataMember, связано с тем, что по умолчанию WebAPI использует XmlSerializer, а не DataContractSerializer.Однако JSON в настоящее время использует JSONDataContractSerializer по умолчанию.Однако в будущем этого не будет.Вы можете изменить XML на XmlDataContractSerializer, установив

GlobalConfiguration.Config.Formatters.XmlDataContractSerializer = true;

Таким образом, и форматы JSON, и XML будут использовать DataContractSerializer.

0 голосов
/ 12 марта 2012

Как это работает, вы будете иметь дело с Форматерами . Получаемые вами XML-данные создаются XmlMediaTypeFormatter ( XmlMediaTypeFomatter Class ).

Мне не известно о какой-либо встроенной функции, которую вы описываете, но написать собственный форматтер довольно просто.

Вот пример реализации пользовательского форматера, вы получите идею:

Использование JSON.NET с ASP.NET Web API

0 голосов
/ 12 марта 2012

Два сериализатора используют разные атрибуты для обработки переименования столбцов и т. Д.

Нет способа объединить, что вам понадобятся оба атрибута.

Однако вы можете использовать другой сериализатор XML / JSON, который распознает другие атрибуты.

UPDATE
Вы также можете попробовать DataAnnotations и посмотреть, распознают ли их сериализаторы

...