6

我开始学习 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 的解释对我没有帮助。

4

3 回答 3

5

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

于 2012-04-20T19:40:53.603 回答
2

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

但是,从概念上讲,您缺少 WebAPI 的魔力的一部分。使用 WebAPI,您可以以本机状态返回对象(如果需要 OData 支持,则返回 IQueryable)。在您的函数调用完成后,Formatter 接管并根据客户请求将其转换为适当的形状。

因此,在您的原始代码中,您转换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 在此视频中展示了一些使用 fiddler 的示例,开始时间约为 37 分钟Pedro Reys在这里对内容协商进行了更深入的研究。

于 2012-04-21T13:52:20.853 回答
0

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

查看:https ://github.com/WebApiContrib/WebAPIContrib/tree/master/src/WebApiContrib.Formatting.JsonNet 。

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

于 2012-04-20T18:42:43.957 回答