2014-11-03 5 views
0

Я вытаскиваю данные из веб-службы, которую я не контролирую. Результаты включают обратную косую черту перед апострофом в именах (например, O'Donnell). Согласно JSLint.com, структура JSON действительна - , за исключением случаев, когда ответ включает апострофы с обратной косой чертой.

Я предупредил поставщика веб-службы. Пока я жду ответа от ReallyBigCo, я хотел узнать больше о том, что возможно в конце запроса.

Есть ли способ лишить персонажей объекта JSON при выполнении запроса $ http.get()?

Я искал решения для захвата ответа в виде строки, чтобы разделить символы. Тем не менее, я получаю сообщение об ошибке, как только закончится функция $ http.get().

Этот AngularJS код отлично работает (когда ответ 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; 
    }); 
}); 

я могу отобразить список писем в моей странице с помощью этого кода, когда JSON действительно:

<p ng-repeat="item in appdata">{{item.email}}</p> 

Вот пример рабочих результатов JSON:

{"findUsers":[ 
{"email":"[email protected]"}, 
{"email":"[email protected]"}, 
{"email":"[email protected]"} 
]} 

Хотя эти результаты JSON вызывают ERRO г:

{"findUsers":[ 
{"email":"[email protected]"}, 
{"email":"[email protected]"}, 
{"email":"[email protected]"}, 
{"email":"ddd.o\'[email protected]"} 
]} 

Результаты с апострофом создает следующую ошибку в консоли в IE9:

SyntaxError: Invalid characterundefined

Я искал решение переформатировать ответ, но любые результаты JSON с апострофом немедленно приводят к этой ошибке. Поэтому не представляется возможным использовать простое решение, такое как results.replace(/'/g,"");, если я не знаю, как обращаться к объекту до возникновения ошибки.

+0

@ T.J.Crowder это Угловая Синтаксический его. У меня была такая проблема. Я решил это, используя Ajax, а не Angular, что не является отличным решением. –

+0

@ toggy-tog-togs: я удалил этот вопрос после двойной проверки JSON.org. –

ответ

1

Вы можете сделать свою собственную трансформацию отклика и «исправить» данные перед преобразованием JSON в объект самостоятельно (plnkr):

$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); 
    }); 
}; 
+0

Спасибо. Полезно увидеть пример transformResponse. Я тестирую копию вашего кода, и я вижу, что он работает с вашим URL-адресом - и он также работает против веб-службы, которую мне нужно использовать **, если JSON действителен **. Когда я делаю запрос, который не включает имя с апострофом назад, функция замены будет работать. Если я делаю запрос, который включает имена с апострофами, объект JSON недействителен (из-за этого обратного слэша), и я получаю аналогичную ошибку: SyntaxEror: Invalid Character error. – charliebowden

+0

Вам, вероятно, придется вручную разобрать JSON или написать какой-нибудь скрипт для его замены, но он не будет работать во всех случаях. Например, вы могли бы заменить '' 'на' \ '', но вы должны были убедиться, что он не должен быть концом строки, т. Е. Сразу следует', ','} 'или'] '. Но что тогда, если один из этих символов тоже в вашей строке?Нет никакого способа надежно 100% разбора недействительного JSON, всегда лучше, чтобы люди исправляли свои веб-сервисы. –

Смежные вопросы