我开始学习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的解释对我没有帮助。
答案 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版本中发布。