AngularJS http.get 验证有效的 JSON

4
从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本身已经失败了。
语法错误:意外的令牌{ 位于Object.parse (native) 在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 (native) 在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。 - Maxim Shoustin
我有同样的问题。它开始发生在返回的一个值上。问题是为什么JSON变成了无效的?服务器难道不应该正确地进行编码吗? - Sonic Soul
2个回答

5
你可以在 $http 中覆盖 transformResponse。查看此 其他答案

0

我也在寻找同样的东西,transformResponse这个函数可以完成任务,但是我不想每次使用$http.get()都要使用它,甚至覆盖它,因为有些$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);
    });

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接