2013-03-25 14 views
241

Mam problem z analizą prostych ciągów JSON. Sprawdziłem je na JSONLint i pokazuje, że są one poprawne. Ale gdy próbuję analizować je przy użyciu JSON.parse lub alternatywę jQuery daje mi błąd unexpected token o:Parsowanie JSON podając błąd "nieoczekiwanego tokenu o"

<!doctype HTML> 
<html> 
    <head> 
    </head> 
    <body> 
    <script type="text/javascript"> 
     var cur_ques_details ={"ques_id":15,"ques_title":"jlkjlkjlkjljl"}; 
     var ques_list = JSON.parse(cur_ques_details); 

     document.write(ques_list['ques_title']); 
    </script> 
    </body> 
</html> 

Uwaga: Jestem kodowania moje struny użyciu json_encode() w PHP.

Odpowiedz

481

Twoje dane są już przedmiotem. Nie trzeba go analizować. Interpreter javascript już to przetworzył dla Ciebie.

var cur_ques_details ={"ques_id":15,"ques_title":"jlkjlkjlkjljl"}; 
document.write(cur_ques_details['ques_title']); 
+5

jak wykryć z jquery, czy dane są już ważnym obiektem json? – mko

+2

@mko: W tym przypadku nie. Wiesz, że to prawda, a ty nie. Spójrz na to i sprawdź, czy jest zgodny ze specyfikacją JSON. –

+3

@DarkFalcon poszedłem z, jeśli (dane typeof == 'object') {dostuff}, aby sprawdzić, czy jest to obiekt json lub zwykły ciąg znaków – mko

9

cur_ques_details jest już obiektem JS, nie trzeba analizować to

+6

Nie ma czegoś takiego jak "obiekt JSON". JSON to ciąg znaków. To, co masz na myśli, to "obiekt JS". – Joseph

+2

Myślę, że miał na myśli "obiekt JavaScript" – raffi

9

Źródłem błędu jest jednak umieszczenie pełnego ciągu JSON w cudzysłowach. Następujące będzie naprawić próbki:

<!doctype HTML> 
<html> 
    <head> 
    </head> 
    <body> 
     <script type="text/javascript"> 
      var cur_ques_details ='{"ques_id":"15","ques_title":"jlkjlkjlkjljl"}'; 
      var ques_list = JSON.parse(cur_ques_details); 
      document.write(ques_list['ques_title']); 
     </script> 
    </body> 
</html> 

Jak inni respondenci wspomnieli, obiekt jest już analizowany na obiekt JS, więc nie trzeba go analizować. Aby zademonstrować, jak osiągnąć to samo bez analizowania, można wykonać następujące czynności:

<!doctype HTML> 
<html> 
<head> 
</head> 
    <body> 
     <script type="text/javascript"> 
      var cur_ques_details ={"ques_id":"15","ques_title":"jlkjlkjlkjljl"}; 
      document.write(cur_ques_details.ques_title); 
     </script> 
    </body> 
</html> 
4

Response jest już analizowana, nie trzeba analizować go ponownie. jeśli ponownie go przeanalizujesz, otrzymasz "unexpected token o". jeśli trzeba, aby ją jako ciąg, można użyć JSON.stringify()

4

miałem ten sam problem, kiedy przedstawił dane za pomocą jQuery AJAX:

$.ajax({ 
    url:... 
    success:function(data){ 
     //server response's data is JSON 
     //I use jQuery's parseJSON method 
     $.parseJSON(data);//it's ERROR 
    } 
}); 

Jeśli odpowiedź jest JSON i użyć tej metody, dane, które otrzymasz, są obiektem JavaScript, ale jeśli używasz dataType:"text", dane są ciągiem JSON. Następnie użycie $.parseJSON jest w porządku.

0

widziałam ten unexpected token o błąd, bo moja (niekompletny) Kod zabrakło wcześniej (live przeładować!) I ustaw wartość szczególną kluczykiem lokalnej pamięci masowej do [object Object] zamiast {}. Dopiero gdy zmieniłem klucze, wszystko zaczęło działać zgodnie z oczekiwaniami. Ewentualnie możesz śledzić numer these instructions to delete the incorrectly set localStorage value.

5

Korzystanie JSON.stringify(data);:

$.ajax({ 
    url: ... 
    success:function(data){ 
     JSON.stringify(data); //to string 
     alert(data.you_value); //to view you pop up 
    } 
}); 
+0

Po prostu wywołanie 'JSON.stringify' nie zrobi nic z twoimi danymi, funkcja faktycznie zwraca twoje_numerowane dane. –

43

Spróbuj przeanalizować tak:

var yourval = jQuery.parseJSON(JSON.stringify(data)); 
+0

To działało dla mnie przy debugowaniu. Wielkie dzięki. Zdałem sobie sprawę, że wysyłam dodatkowe niepotrzebne informacje od kontrolera. – Pathros