2016-07-05 7 views
1

Я использую $http.get() сделать запрос GET, ответ в формате JSON, но с HTML-кодирования для некоторых символов, один пример, как показано ниже, "кодируется с "SyntaxError: Неожиданный маркер и в формате JSON

{ 
    "description":"invalid", 
    "errorCode":"error.loginInvalid" 
} 

Также я использую $httpProvider.interceptors.push('httpErrorsInterceptor');, httpErrorsInterceptor покажет информацию об ошибке в responseError. Так как ответ JSON не декодируется должным образом, при попытке обработать его, он будет показывать SyntaxError: Unexpected token & in JSON в консоли. Интересно, как мы можем расшифровать ответ JSON при обработке? В $httpProvider?

+0

Вы контролируете источник? если так ... как это получается в первую очередь? Это недопустимо json – charlietfl

+0

@charlietfl да, это JSON, но некоторые специальные символы закодированы. – chancyWu

+0

Так почему бы не просто удалить дополнительную кодировку? (особенно это не имеет смысла) – zerkms

ответ

0

Один из способов преобразования html объектов в текст - создать элемент dom, вставить строку как html и вернуть ее в виде текста. DOM парсер будет делать работу лучше преобразования, чем писать свой собственный

var str='{ "description":"invalid", "errorCode":"error.loginInvalid&quot"}' 
var JSON = angular.element('<div>').html(str).text(); 

Но пример, показанный еще недействителен JSON из-за дополнительной цитатой по последнему значению

working demo with last &quot removed

+0

извините, я удалил дополнительную цитату по последнему значению ~ – chancyWu

+0

ОК, если это ушло, это должно сработать ... просто JSON.parse() результат.Тем не менее, нет веской причины, по которой конвертер xml должен делать это – charlietfl

+0

да, но это не под моим контролем. ~ – chancyWu

0

тип содержимого ответа является text/html;charset=UTF-8, но angularjs будет анализироваться как JSON, поскольку он начинается с { и заканчивается }, тогда как контент кодируется как HTML, поэтому он будет показывать синтаксическую ошибку, когда парсер встречается с символом &.

Одно из решений состоит в обеспечении transformResponse в $http.config, которая является то, как показано ниже:

$http({ 
    method: 'get', 
    url: yourURL, 
    transformResponse: transformResponse 
}); 

function transformResponse(data) { 
    var json = angular.element('<div>').html(data).text(); 
    return JSON.parse(json); 
} 

Если вы хотите, чтобы преобразовать все ответ, вы можете добавить transformResponse к $httpProvider.defaults.transformResponse.

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