【问题标题】:AngularJS http.get verify valid jsonAngularJS http.get 验证有效的 json
【发布时间】:2013-10-17 09:49:17
【问题描述】:

当从 URL 获取 json 时,我只想在数据有效时使用它。

到目前为止我使用JSON的方法:

$http.get(
            'data/mydata.json'
                + "?rand=" + Math.random() * 10000,
            {cache: false}
        )
            .then(function (result) {

                try {
                    var jsonObject = JSON.parse(JSON.stringify(result.data)); // verify that json is valid
                    console.log(jsonObject)

                }
                catch (e) {
                    console.log(e) // gets called when parse didn't work
                }


            })

然而,在我进行解析之前,angular 已经失败了

SyntaxError: Unexpected token { 在 Object.parse (本机) 在 fromJson (http://code.angularjs.org/1.2.0-rc.2/angular.js:908:14) 在 $HttpProvider.defaults.defaults.transformResponse (http://code.angularjs.org/1.2.0-rc.2/angular.js:5735:18) 在http://code.angularjs.org/1.2.0-rc.2/angular.js:5710:12 在 Array.forEach (本机) 在 forEach (http://code.angularjs.org/1.2.0-rc.2/angular.js:224:11) 在 transformData (http://code.angularjs.org/1.2.0-rc.2/angular.js:5709:3) 在 transformResponse (http://code.angularjs.org/1.2.0-rc.2/angular.js:6328:17) 在 WrappedCallback (http://code.angularjs.org/1.2.0-rc.2/angular.js:9106:81) 在http://code.angularjs.org/1.2.0-rc.2/angular.js:9192:26 angular.js:7861

如何防止 Angular 抛出此错误,或者我应该如何处理验证 JSON?

更新:解决方案:

$http.get(
// url:
'data/mydata.json'
    + "?rand=" + Math.random() * 10000

,

// config:
{
    cache: false,
    transformResponse: function (data, headersGetter) {
        try {
            var jsonObject = JSON.parse(data); // verify that json is valid
            return jsonObject;
        }
        catch (e) {
            console.log("did not receive a valid Json: " + e)
        }
        return {};
    }
}
)

【问题讨论】:

  • 它的故事很好,但你能发布你的result.data吗?或更好的 Plunker
  • 我也有同样的问题。它开始发生在返回的值之一上。问题是为什么json变得无效?服务器不应该正确编码吗?

标签: json angularjs verify


【解决方案1】:

您可以覆盖 $http 中的transformResponse。检查这个other answer

【讨论】:

    【解决方案2】:

    我一直在寻找同样的东西,transformResponse 完成了这项工作,但是,我不喜欢每次使用 $http.get() 时都使用 transformResponse,甚至因为一些 $http.get 覆盖它() 将是 json,有些则不是。

    所以,这是我的解决方案:

    myApp.factory('httpHandler', function($http, $q) {            
      function createValidJsonRequest(httpRequest) {
        return {
          errorMessage: function (errorMessage) {
            var deferred = $q.defer();
    
            httpRequest
              .success(function (response) {
                if (response != undefined && typeof response == "object"){
                    deferred.resolve(response);
                } else {
                    alert(errorMessage + ": Result is not JSON type");
                }
              })
              .error(function(data) {
                deferred.reject(data);
                alert(errorMessage + ": Server Error");
              });
    
            return deferred.promise;
          }
        };
      }
    
      return {
        getJSON: function() {
          return createValidJsonRequest($http.get.apply(null, arguments));
        },
        postJSON: function() {
          return createValidJsonRequest($http.post.apply(null, arguments));
        }
      }
    });
    
    
    myApp.controller('MainCtrl', function($scope, httpHandler) {
      // Option 1
      httpHandler.getJSON(URL_USERS)
        .errorMessage("MainCtrl -> Users")
        .then(function(response) {
          $scope.users = response.users;
        });
    
    
      // Option 2 with catch
      httpHandler.getJSON(URL_NEWS)
        .errorMessage("MainCtrl -> News")
        .then(function(response) {
          $scope.news = response.news;
        })
        .catch(function(result){
          // do something in case of error
        });
    
    
      // Option 3 with POST and data
      httpHandler.postJSON(URL_SAVE_NEWS, { ... })
        .errorMessage("MainCtrl -> addNews")
        .then(function(response) {
             $scope.news.push(response.new);
        });
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多