【问题标题】:Web API does not serialize bool return type as a json boolean valueWeb API 不会将 bool 返回类型序列化为 json 布尔值
【发布时间】:2014-08-26 18:11:28
【问题描述】:

我有这个 ASP.NET Web API 方法:

[HttpGet]
public bool IsCodeValid(string code)
{
    return db.Usagers.Any(u => u.CodeAcces == code);
}

我从 Angularjs 的 $http.get 方法调用这个 Web API 方法:

return $http.get("/lewis/production/clockin/iscodevalid?code=" + code);

这是结果:

[object Object]{config: Object {...}, data: "false", status: 200, statusText: "OK"}

查看 data 属性,它是“false”(作为 字符串)。

我希望它是一个原始布尔值,所以,回到我的 javascript 客户端代码,我可以这样做

if (result.data) {
  // do something if the result is true ...
}

因为现在,我不得不做这件丑事:

if (result.data == "true") {
}

我从我的自定义“userService”服务中得到结果:

userService.isCodeValid($scope.code).then(function (result)
{
    console.log(result);
});

这是我的 userService 中 isCodeValid 方法的代码:

angular.module('clockin').service('userService', ['$http',
    function ($http) {
        this.isCodeValid = function (code) {
            return $http.get("/lewis/production/clockin/iscodevalid?code=" + code);
        };
    }
]);

知道我错过了什么吗?

【问题讨论】:

  • 您希望它以布尔值的形式返回,还是使其成为一个布尔值?
  • 这与 JSON 解析有关,将 data 的类型定义为 bool,解析应该返回一个布尔值,而不是字符串。
  • @YuvalItzchakov 我希望我的 javascript 代码将该值视为布尔值。
  • @Habib :该对象由 Angular 的 $http.Get 方法构建。我对此无能为力。可以举个例子吗?
  • @JoanLeaven,你是如何获取/解析 JSON 字符串到你的对象 result 的?

标签: c# json angularjs asp.net-web-api boolean


【解决方案1】:

JSON 是 JS Object 表示法。你没有返回一个对象,只是一个布尔值。如果没有将服务器响应正文包装在{ .. } 中,浏览器只能假设它从服务器获得的这个字符串实际上只是一个字符串。将您的服务响应包装在一个对象中,bool 属性将被序列化为 bool。

您甚至不需要为此定义一个新类:

[HttpGet]
public object IsCodeValid(string code)
{
    return new { result: db.Usagers.Any(u => u.CodeAcces == code) };
}

(然后相应地更改客户端)

另一种方法是修改 JS 将字符串转换为布尔值。

【讨论】:

  • 谢谢@RobertLevy。当我将布尔值包装在匿名对象中时,它可以工作。
  • 我要补充的一点是 - 它应该是 result = 而不是 result:。无论如何,非常感谢您的帮助。
【解决方案2】:

JSON 只是字符串数据,很像 XML(只是更紧凑)。您看到的结果是服务器返回的原始结果。当您通过 JSON 解析器(例如 Newtonsoft.Json)处理该结果时,您将得到实际的 bool 类型,如您所愿。

【讨论】:

  • 您的意思是我必须将生成的字符串转换为布尔值,然后再返回到我的客户端 javascript 代码中?那将是荒谬的。日期时间类型呢?我必须手动将所有内容转换回相应的数据类型?
  • 只需调用JSON.parse 传递来自网络调用的数据结果。你应该得到一个布尔类型。这是将 JSON 字符串转换为对象图的非常标准的行为。
  • 谢谢@RobEpstein。使用 JSON.parse 解析结果是其他两个答案的可行替代方法,这两个答案建议在返回之前将布尔值包装在对象中。
  • @JoanLeaven - 我个人会避免返回不必要的数据(将 bool 包装为匿名类型的结果)。如果可能,请尝试使用JSON.parse 解决方案来保持您的网络流量最小。干杯!
【解决方案3】:

通过插入一个匿名传输对象作为父元素,将您的元素移出根:

 [HttpGet]
 public bool IsCodeValid(string code)
 {
     return new {isValid: db.Usagers.Any(u => u.CodeAcces == code)};
 }

【讨论】:

  • 如果它解决了您的问题,请随时投票或接受答案:)
猜你喜欢
  • 2023-04-09
  • 2013-04-26
  • 2020-04-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多