在MVC4项目中使用Json.NET序列化程序

时间:2012-04-20 18:35:58

标签: asp.net-mvc serialization asp.net-web-api json.net

我开始学习Json.NET,但是我在使用它的序列化程序时遇到了麻烦。我有一个带有Web.API服务的新MVC4项目:

public class PTE_TestsController : ApiController {

  PTE_TestsRepository _repository = new PTE_TestsRepository();

  // GET /api/PTE_Tests/5
  public HttpResponseMessage<string> Get(int id) {
    try {
       PTE_Test test = _repository.GetTest(id);
       return new HttpResponseMessage<string>(JsonConvert.SerializeObject(test));
    } catch {
       return new HttpResponseMessage<string>(HttpStatusCode.NotFound);
    }
  }
}

JsonConvert.SerializeObject()按预期工作并返回一个字符串。我的Web.API控制器将其作为HttpResponseMessage的一部分返回。在Fiddler中查看时,最终结果不是JSON数据,而是再次序列化JSON数据(我认为):

"{\"ID\":1,\"Name\":\"Talar Tilt\",\"TagID\":1,\"PracticeID\":1,
   \"SpecificAreaID\":1,\"TypeID\":1,\"VideoID\":1,\"PicID\":1}"

有人知道如何关闭默认的序列化程序,以便我可以直接使用Json.NET吗?顺便说一句,我没有使用默认的序列化程序,因为我无法弄清楚如何使它适用于复杂的对象(PTE_Test最终将包含List类型的成员)。

或者,如果有人可以解释如何使用带有复杂对象的默认序列化程序,它也将解决我的问题。 MSDN的解释对我没有帮助。

3 个答案:

答案 0 :(得分:5)

Rick Strahl在here上有一个博客,其代码可以运行。

答案 1 :(得分:2)

正如其他人所指出的那样,您需要创建一个格式化程序并将DataContractSerializer替换为JSON.NET序列化程序。虽然,如果你没有专门针对JSON.NET,有传言说下一个beta / rc将支持内置的JSON.NET。

然而,从概念上讲,您缺少WebAPI的部分魔力。使用WebAPI,您可以将对象恢复为原生状态(如果需要OData支持,则返回IQueryable)。函数调用完成后,Formatter接管并根据客户端请求将其转换为正确的形状。

因此,在原始代码中,您将PTE_Test转换为JSON字符串并将其返回,此时JSON Formatter启动并序列化字符串。我修改了你的代码如下:

  public class PTE_TestsController : ApiController {
    PTE_TestsRepository _repository = new PTE_TestsRepository();

    public HttpResponseMessage<PTE_Test> Get(int id)  {
        try {
            PTE_Test test = _repository.GetTest(id);
            return new HttpResponseMessage(test);
        } catch {
            return new HttpResponseMessage<string>(HttpStatusCode.NotFound);
        }
     }
   }

注意您的函数如何返回PTE_Test而不是string。假设请求带有Accept = application/json的请求标头,则将调用JSON格式化程序。如果请求的标头为:Accept = text/xml,则调用XML格式化程序。

关于这个主题here有一篇不错的文章。如果你是一个视觉学习者,Scott Gu在this video, starting around 37 minutes中展示了一些使用fiddler的例子。 Pedro Reys深入研究了content negotiation here

答案 2 :(得分:0)

这样做的方法是使用格式化程序。

退房:https://github.com/WebApiContrib/WebAPIContrib/tree/master/src/WebApiContrib.Formatting.JsonNet

Json.NET支持将在Web API的RC版本中发布。