有没有办法用WCF Web API控制JSON格式?

时间:2012-02-09 16:16:36

标签: .net json rest formatting wcf-web-api

即将到来的WCF Web API,有没有办法控制JSON输出?

我想更改外壳并且可能会在序列化类时禁止包含某些属性。

作为一个例子,请考虑这个非常简单的类:

[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"
    }
  ]
}

剥离某些类属性的方法也不错。

3 个答案:

答案 0 :(得分:2)

尝试在codeplex上使用WCF Web API Contrib项目中的JSON.NET Formatter。此处显示的属性可以帮助您https://json.svn.codeplex.com/svn/trunk/Doc/SerializationAttributes.html

答案 1 :(得分: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; }
}

答案 2 :(得分:1)

JSON.NET有几个属性选项,可以控制序列化的内容和方式。 http://james.newtonking.com/projects/json/help/