2013-04-12 3 views
7

Я пробовал сделать запрос ajax, но, похоже, проблема. Когда мои имена атрибутов json находятся в "(например, {" name ": value"}), он работает, но когда имена атрибутов отсутствуют. У меня после excepitonAngularJS JSON parse (ajax)

SyntaxError: Unexpected token s 
at Object.parse (native) 
at pb (http://localhost:8080/angularjs/lib/angular.min.js:12:472) 
at Vc.d.defaults.transformResponse (http://localhost:8080/angularjs/lib/angular.min.js:92:314) 
at http://localhost:8080/angularjs/lib/angular.min.js:92:127 
at Array.forEach (native) 
at n (http://localhost:8080/angularjs/lib/angular.min.js:6:192) 
at Qb (http://localhost:8080/angularjs/lib/angular.min.js:92:109) 
at c (http://localhost:8080/angularjs/lib/angular.min.js:93:295) 
at h (http://localhost:8080/angularjs/lib/angular.min.js:77:437) 
at http://localhost:8080/angularjs/lib/angular.min.js:78:169 

Вот мой код:

index.html:

<!doctype html> 
<html ng-app> 
<head> 
<script src="lib/angular.min.js"></script> 
<script src="js/indexApp.js"></script> 
</head> 
<body> 
    <div> 
     <div ng-controller="AjaxController"> 
      {{users.data}} 
     </div> 
    </div> 
</body> 
</html> 

indexApp.js

function AjaxController($scope, $http) { 
$scope.beers = [ 0, 1, 2, 3, 4, 5, 6 ]; 
console.log("OMW"); 
$http({ 
    method : 'GET', 
    url : 'data.json' 
}).success(function(data, status, headers, config) { 
    $scope.users = data; 
}).error(function(data, status, headers, config) { 
    $scope.users = "error" + data; 
}); 

};

data.json

{ 
    success : "true", 
    data: [{name:"val"}] 
} 

ответ

18

Вы обязательно обертка имена атрибутов в ". Это единственный способ указать допустимый транспортный JSON, который является строже, чем обозначение объекта в исполняемом JavaScript-контексте. Любой анализатор JSON не будет работать, если вы попытаетесь использовать более слабую нотацию.

См. Также the spec for JSON, который предусматривает это.

+1

Вы сохранили мою работу на выходных, человек. Благодаря тонну. – curlyreggie

+0

@Ezekiel Victor Как вы обернули имя атрибута ?? – Despertaweb

+0

@Despertaweb Что вы имеете в виду? Обозначить имя атрибута двойными кавычками; например '" name "вместо" name ". Если вы используете какой-либо JSON-сериализатор, например, 'JSON.stringify (...) 'или PHP' json_encode (...) 'он сделает это правильно для вас. –

8

Даже у меня был аналогичная проблема, и решение, ваши строковые данные должны быть в определенном формате для JSON.parse или angular.fromJson работать.

Для Например:

var myString = '{"name":"nomad"}'; 
console.log(JSON.parse(myString)); 

Выход консоли: Объект {имя: "кочевник"}

0

В моем случае, это возвращается следующее сообщение об ошибке:

SyntaxError: Unexpected token '

at Object.parse (native)

at fromJson (http://www.example.com/bower_components/angular/angular.js:1072:14)

Итак, мы выяснили, что то, что происходило внутри на угловом, было следующим:

JSON.parse("{'error': 'message'}"); // error 

И действительно возвращает ошибку синтаксического анализа, так как он ожидал JSON, чтобы строки, завернутые с ", as the accepted answer points out.

Итак, мы только исправили ответ сервера соблюдать JSON string specification:

JSON.parse('{"error": "message"}'); // works! 
1

Я имел ту же ошибку. Один из firstName был пустой строкой, подобной этой. {"firstName":"", "lastName":"Doe"} Редактировать: Эта ошибка также может означать, что в вашем файле json есть некоторые синтаксические ошибки. например, комментируя некоторые вещи в json-файле или не давая пробел между запятыми, разделяющими две пары значений ключа, также бросает ту же ошибку. Очень начальная ошибка считала, что это поможет другим.