2012-02-09 1 views
2

С наступающим WCF Web API, есть ли способ управления выходом JSON?Есть ли способ управлять форматированием JSON с помощью веб-API WCF?

Я хотел бы изменить корпус и, возможно, подавить, что некоторые свойства включены, когда класс сериализуется.

В качестве примера, рассмотрим это очень просто класс:

[XmlRoot("catalog", Namespace = "http://api.247e.com/catalog/2012")] 
public class Catalog 
{ 
    [XmlArray(ElementName = "link-templates")] 
    public LinkTemplate[] LinkTemplates { get; set; } 
} 

Как вы можете видеть, я добавил различные XML атрибуты к ней для того, чтобы контролировать, как это сериализовать в XML. Могу ли я сделать то же (или что-то еще) для JSON?

Для справки, вот пример вывода в формате XML:

<catalog xmlns="http://api.247e.com/catalog/2012" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <link-templates> 
     <link-template href="http://localhost:9000/search/?criterion={criterion}" 
         rel="http://docs.247e.com/rels/search"/> 
    </link-templates> 
</catalog> 

Для JSON, эквивалентный результат:

{ 
    "LinkTemplates": 
    [ 
    { 
     "Href":"http:\/\/localhost:9000\/search\/?criterion={criterion}", 
     "Rel":"http:\/\/docs.247e.com\/rels\/search" 
    } 
    ] 
} 

Однако, я хотел бы изменить корпус свойств , поэтому я бы предпочел бы что-то вроде этого:

{ 
    "linkTemplates": 
    [ 
    { 
     "href":"http:\/\/localhost:9000\/search\/?criterion={criterion}", 
     "rel":"http:\/\/docs.247e.com\/rels\/search" 
    } 
    ] 
} 

Способ удаления определенных свойств класса также будет b Очень приятно.

ответ

2

WCF Web API по умолчанию использовал DataContractJsonSerializer для возврата ресурса в формате JSON. Поэтому вы должны использовать атрибуты DataContract и DataMember в своем классе для формирования результата JSON.

[DataContract] 
public class Book 
{ 
    [DataMember(Name = "id")] 
    public int Id { get; set; } 
    [DataMember(Name = "title")] 
    public string Title { get; set; } 
    [DataMember(Name = "author")] 
    public string Author { get; set; } 
    [XmlIgnore] // Don't send this one 
    public string ImageName { get; set; } 
}