在 MVC4 项目中使用 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() 按预期工作并返回一个字符串。 My 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的解释对我没有帮助。

Rick Strahl 在这里有一个关于此的博客,其中包含一个有效的代码。

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

但是,从

概念上讲,您错过了WebAPI的部分魔力。 使用 WebAPI,您可以返回处于本机状态的对象(如果需要 OData 支持,则返回 IQueryable)。 函数调用完成后,格式化程序的接管并根据客户端请求将其转换为正确的形状。

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

  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 格式化程序。

这里有一篇关于这个主题的不错的文章。如果你是一个视觉学习者,Scott Gu在这个视频中展示了一些使用小提琴手的例子,从大约37分钟开始。 佩德罗·雷伊斯(Pedro Reys)在这里对内容谈判进行了更深入的挖掘。

执行此操作的方法是使用格式化程序。

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

Json.NET 支持将在 Web API 的 RC 版本中提供。

相关内容

  • 没有找到相关文章

最新更新