2013-04-12 16 views
7

Byłem tring, aby wniosek ajax, ale wydaje się, że jest problem. Kiedy moje nazwy atrybutów json są w "(jak {" nazwa ": wartość"}), działa, ale gdy nazwy atrybutów nie są. Mam następujący excepitonAnglesJS 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 

Tu jest mój kodu:

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"}] 
} 

Odpowiedz

18

Ty koniecznością okład nazwy atrybutów w ". Jest to jedyny sposób określenia prawidłowego JSON transportu, który jest bardziej restrykcyjny niż notacja obiektowa w wykonywalnym kontekście JavaScript. Dowolny parser JSON zakończy się niepowodzeniem, jeśli spróbujesz użyć bardziej rozwlekłej notacji.

Zob. Także the spec for JSON, która to upoważnia.

+1

Uratowałeś moją pracę Weekendową, człowieku. Dzięki za tonę. – curlyreggie

+0

@Ezekiel Victor Jak owinąłeś nazwę atrybutu? – Despertaweb

+0

@Despertaweb co masz na myśli? Zawijanie nazwy atrybutu z podwójnymi cudzysłowami; na przykład '" name "zamiast" name ". Jeśli używasz dowolnego serializatora JSON, np. 'JSON.stringify (...) 'lub PHP' json_encode (...) 'zrobi to poprawnie dla ciebie. –

8

Nawet miałem podobny problem i roztwór, dane ciąg powinien być w określonym formacie JSON.parse lub angular.fromJson do pracy.

Dla ex:

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

Wyjście konsoli to: Object {name: "koczownik"}

0

W moim przypadku, to wracał następujący błąd:

SyntaxError: Unexpected token '

at Object.parse (native)

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

Więc dowiedzieliśmy się, że to, co działo się wewnętrznie na kątowym, było następujące:

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

I rzeczywiście zwraca błąd parsera, ponieważ jest spodziewane JSON mieć łańcuchy zapakowane z ", as the accepted answer points out.

Więc, po prostu stała odpowiedź serwera do przestrzegania JSON string specification:

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

Miałem ten sam błąd. Jednym z firstName był pusty ciąg jak ten. {"firstName":"", "lastName":"Doe"} edytuj: ten błąd może również oznaczać, że w pliku json występują błędy składniowe. na przykład komentowanie niektórych elementów w pliku json lub brak spacji między przecinkami oddzielającymi dwie pary wartości klucza również spowodował ten sam błąd. Bardzo początkujący błąd myślał, że to pomoże innym.