我开始学习 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 版本中提供。