【问题标题】:Camel Case Web API Json settings do not seem to be workingCamel Case Web API Json 设置似乎不起作用
【发布时间】:2015-10-29 09:58:52
【问题描述】:

我的 WebApiConfig.cs 文件和 Register 方法中有此代码:

var jsonFormatter=config.Formatters.JsonFormatter;
jsonFormatter.UseDataContractJsonSerializer = false;
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

尽管如此(我确实确保这段代码确实是通过使用 Debugger.Launch() 执行的),但它仍然以 Pascal Case 输出我的所有 Json。

下面是action方法中的代码:

[HttpGet]
[Route("Details")]
public IHttpActionResult Details() {            
    using (var context = new Security.Context()) {              
        var user = context.Users.Current;
        if (user == null) { return Json((object)null); }
        return Json(user);
    }
}

我看不出我做错了什么,是我遗漏了什么吗?

【问题讨论】:

  • 尝试类似 var serialized = JsonConvert.SerializeObject(value, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver()});
  • 谢谢,效果很好,它按预期以骆驼大小写输出,但我想全局执行此操作,而不是在每个操作中添加这段代码。
  • 我在 action 方法中放置了一个断点,并将全局配置 JsonFormatter 保存到断点之前的局部变量中,这样我就可以在进入 Json 调用之前检查其设置并设置为使用CamelCasePropertyNamesContractResolver 类。我只是不明白为什么它似乎根本没有被使用。

标签: c# json json.net asp.net-web-api2 camelcasing


【解决方案1】:

返回具体类型(在您的情况下为User),而不是返回IHttpActionResult。这样,您将避免许多潜在问题,包括序列化、可测试性和内容协商。

【讨论】:

  • 我喜欢这个作为答案,但目前,如果找不到用户,我可以使用 Ok(user) 或 Unauthorized 。如果我返回 User 类型,我想我必须引发一个异常,我可以引发一个返回 401 状态的异常吗?
  • @Anupheaus 您可以抛出自己的异常,然后使用 Web API Exception Filters 将其转换为适当的状态码。
【解决方案2】:

所以也许有人可以解释这一点,但我发现使用 ApiController.Json 方法似乎没有使用任何全局格式化程序(我将它们全部删除,该方法仍然有效并返回有效的 Json,尽管在 Pascal Case 中)。

当我使用 ApiController.Ok 方法时,它确实使用了全局格式化程序和应用于它们的任何设置,例如 CamelCasePropertyNamesContractResolver。

所以我的解决方案是使用“Ok”而不是“Json”...但是为什么它们不同我不知道...

【讨论】:

  • 没有ApiController.Json 方法,您使用的是Controller.Json 方法,它不是属于Web API。
  • 你的意思是这个ApiController.Json不存在?
  • 嗯...这很奇怪!如果您看到类定义,您会看到 Json() 是 System.Web.Mvc.Controller 类的一部分,而不是 System.Web.Http.ApiController 类!
  • 好吧,我肯定在使用 ApiController,并且肯定在最近创建的项目中使用 ApiController 中的 Json 方法,但该链接显示该方法存在于 ApiController 类中。
  • 在我看来这是更正确的答案,ApiController.Json 旨在用于以特定格式返回 JSON,而使用 ApiController.Ok<T> 你说“返回此内容”然后你离开它由 Web API 来确定(基于 Accept 标头)应该将内容序列化为什么(XML/JSON 等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2019-06-19
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
相关资源
最近更新 更多