Javascript 如何从JSON$http.get()请求中删除无效字符?

Javascript 如何从JSON$http.get()请求中删除无效字符?,javascript,json,angularjs,Javascript,Json,Angularjs,我正在从一个我无法控制的web服务中提取数据。结果包括名称中撇号前的反斜杠(如O'Donnell)。根据JSLint.com,JSON的结构是有效的——除非响应包含反斜杠撇号 我已通知web服务提供商。当我等待ReallyBigCo的回复时,我想了解更多关于请求端可能发生的事情 在发出$http.get()请求时,有没有办法从JSON对象中删除字符? 我一直在寻找解决方案,将响应捕获为字符串,以便去除字符。但是,$http.get()函数一完成,我就会收到一个错误 此AngularJS代码工作正

我正在从一个我无法控制的web服务中提取数据。结果包括名称中撇号前的反斜杠(如O'Donnell)。根据JSLint.com,JSON的结构是有效的——除非响应包含反斜杠撇号

我已通知web服务提供商。当我等待ReallyBigCo的回复时,我想了解更多关于请求端可能发生的事情

在发出$http.get()请求时,有没有办法从JSON对象中删除字符?

我一直在寻找解决方案,将响应捕获为字符串,以便去除字符。但是,$http.get()函数一完成,我就会收到一个错误

此AngularJS代码工作正常(当JSON响应有效时):

当JSON有效时,我可以使用以下代码在我的页面中显示电子邮件列表:

var app = angular.module('app',[]);

app.factory('appresults', function($http) {
  return {
    getAsync: function(callback) {
      var myURL = https://address-to-really-big-co-webservice.com;
      $http.get(myURL).success(callback);
    }
  };
});

app.controller('appcontroller', function($scope, appresults) {
  appresults.getAsync(function(results) {
    $scope.appdata = results.findUsers;
  });
});
<p ng-repeat="item in appdata">{{item.email}}</p>
虽然这些JSON结果会导致错误:

{"findUsers":[
{"email":"aaa.somebody@domain.com"},
{"email":"bbb.somebody@domain.com"},
{"email":"ccc.somebody@domain.com"},
{"email":"ddd.o\'somebody@domain.com"}
]}
带撇号的结果在IE9的控制台中创建以下错误:

语法错误:无效字符未定义


我一直在寻找重新格式化响应的解决方案,但任何带有撇号的JSON结果都会立即导致此错误。因此,似乎不可能使用简单的解决方案,例如
results.replace(/“/g,”)除非我知道如何在错误发生之前寻址对象。

您可以自己对响应进行转换,并在将JSON转换为对象之前“修复”数据():


@T.J.Crowder这是一个很好的例子。我遇到过这样的问题。我通过使用Ajax而不是Angular解决了这个问题,这不是一个很好的解决方案。@toggy-tog-togs:我在仔细检查JSON.org后删除了这个问题。谢谢。查看transformResponse的示例很有帮助。我正在测试代码的一个副本,我发现它可以与您的URL一起工作——如果JSON是有效的,它也可以与我需要使用的web服务一起工作。当我发出一个不包含带有反斜杠撇号的名称的请求时,replace函数将起作用。如果我发出一个包含带撇号的名称的请求,JSON对象无效(因为那个反斜杠),我会得到一个类似的错误:SyntaxError:invalid Character error。您可能需要手动解析JSON,或者编写一些脚本来替换它,但它不会在所有情况下都起作用。例如,您可以将
'
替换为
\'
,但必须确保它不是字符串的结尾,即紧跟
}
]
。但是如果其中一个字符也在您的字符串中呢?没有办法100%可靠地解析无效的JSON,最好是让人们纠正他们的web服务。
{"findUsers":[
{"email":"aaa.somebody@domain.com"},
{"email":"bbb.somebody@domain.com"},
{"email":"ccc.somebody@domain.com"},
{"email":"ddd.o\'somebody@domain.com"}
]}
$scope.testOther = function() {
  $http.get(url, { 
    transformResponse: function(data, headersGetter) {
      // here data is the raw string, you can fix the data here
      // replace first object property name "coord" with "FIXED"
      data = data.replace("coord", "FIXED");
      return angular.fromJson(data);
    }
  }).success(function(data) {
    setValues(data);
  });
};