2009-03-10 14 views
15

Próbowałem analizować następujące odpowiedzi JSON zarówno z JQuery getJSON i AJAX:JQuery getJSON - ajax parseerror

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}] 

Ja również próbował go ucieczki "/" znaki tak:

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview <\/h1><h1>January 29, 2009<\/h1>"}] 

Kiedy używam getJSON, dawka nie wykonuje wywołania zwrotnego. Tak, próbowałem go z jQuery AJAX następująco:

$.ajax({ 
    url: jURL, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    beforeSend: function(x) { 
     if(x && x.overrideMimeType) { 
      x.overrideMimeType("application/j-son;charset=UTF-8"); 
     } 
    }, 
    success: function(data){ 
     wId = data.iId; 
     $("#txtHeading").val(data.heading); 
     $("#txtBody").val(data.body); 
     $("#add").slideUp("slow"); 
     $("#edit").slideDown("slow"); 
    },//success 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown); 
    } 
}); 

Ajax uderza Błąd ans powiadomienia następujące:

XMLHttpRequest=[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview </h1><h1>January 29, 2009</h1>"}] 

textStatus=parseerror 

errorThrown=undefined 

Następnie próbowałem proste JQuery dostać wezwanie do zwrotu JSON przy użyciu następujących Kod:

$.get(jURL,function(data){ 
    var json = eval("("+data+");"); 
    wId = json.iId; 
    $("#txtHeading").val(json.heading); 
    $("#txtBody").val(json.body); 
    $("#add").slideUp("slow"); 
    $("#edit").slideDown("slow"); 
}) 

.get zwraca JSON, ale eval pochodzi z błędami niezależnie od tego, w jaki sposób zostały zmodyfikowane JSON (nagłówek Content-Type, inne odmiany tego formatu, itd.)

To, co wymyśliłem, to kwestia, która zwraca kod HTML w JSON i generuje go. Mam jednak nadzieję, że przegapiłem coś, co pozwoliłoby mi uzyskać te dane przez JSON. Czy ktoś ma jakieś pomysły?

+0

Czy to wszystko z zwróconego JSON? –

+0

Poprawiono formatowanie. w przyszłości wystarczy wcięcie kodu 4 spacje i możesz już iść. –

+0

Tak, to wszystko z zwróconego JSON. Po prostu próbuje zwrócić pojedynczy element z 3 wartościami (identyfikator, nagłówek, treść) z bazy danych (aby użytkownicy mogli go zaktualizować). Nie byłby to pełny dokument HTML. Właśnie to, co muszę wyświetlić w div. Dzięki za formatowanie !!! –

Odpowiedz

1

Czy próbowałeś kodowania XML kodu HTML (to jest & lt; H1 & gt;)?

+0

Po prostu wypróbowałem i nadal mam parseerror. –

1

Można mieć powróci jako tekst, a następnie analizować je z json.org parser
Aby sprawdzić, czy to działa inaczej

0

Najpierw spróbuj wskazać, czy problem jest z ogólnie JSON kodowania/dekodowania. spróbuj prostszych obiektów, z liczbami i zwykłymi ciągami, a następnie z cytowanym HTML.

Po uruchomieniu JSON, naprawdę powinieneś rozważyć usunięcie tego HTMLa. Znacznie lepiej jest przenosić tylko dane i pozostawić szczegóły prezentacji w szablonach. Podczas korzystania z AJAX oznacza to ukryty szablon w kodzie HTML i użycie jQuery do replikacji i wypełnienia danymi. sprawdź dowolny z jQuery template plugins. Spośród nich, jTemplates jest popularnym faworytem.

+0

Działa dobrze, dopóki nie dodaję kodu HTML ... ale jest to tylko kilka znaczników H1. Próbowałem wypróbować je na różne sposoby, ale nic nie jest w stanie tego naprawić. –

+0

Czy może to być twój serwer, który uszkadza JSON, gdy znajdzie HTML? – Javier

0

Myślę, że zadajesz niewłaściwe pytanie. Używanie $ .getJSON() jest znacznie łatwiejsze, a jeśli masz z tym problem, lepiej byłoby poprosić o $ .getJSON() niż o $ .ajax(). Możesz również znaleźć użyteczne spojrzenie na kod źródłowy funkcji getJSON, ponieważ widzę, że masz mnóstwo bezużytecznych rzeczy z mimeTypes. To nie tak.

0

Wartość, którą próbujesz przeanalizować, jest zawijana w nawiasy kwadratowe [], co oznacza, że ​​jest to tablica. Próbujesz oszacować tablicę. Spróbuj eval pierwszy element tablicy, a to powinno działać ...

var json = eval("("+data[0]+");"); 

Również polecam pomocą JSON.parse() pod warunkiem here zamiast wywoływania funkcji eval() bezpośrednio.

+0

To wygląda obiecująco. Przechodzi teraz przez eval(), ale json var jest wyświetlany jako niezdefiniowany. –

7

Łańcuch JSON, który posiadasz, jest tablicą zawierającą 1 obiekt, więc aby uzyskać dostęp do obiektu, musisz najpierw uzyskać dostęp do tablicy. Z jsonem.php, który wygląda tak:

[ 
    { 
     "iId": "1", 
     "heading": "Management Services", 
     "body": "<h1>Program Overview</h1><h1>January 29, 2009</h1>" 
    } 
] 

Właśnie próbowałem

$.getJSON("json.php", function(json) { 
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1> 
    alert(json[0].heading); // "Management Services" 
    alert(json[0].iId); // "1" 
}); 

Próbowałem też tak:

$.get("json.php", function(data){ 
    json = eval(data); 
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1> 
    alert(json[0].heading); // "Management Services" 
    alert(json[0].iId); // "1" 
}); 

I obaj pracowali w porządku dla mnie.

+0

Mój wydaje się, że nigdy nie powróci. Nie mogę więc uruchomić funkcji. Jest to jednak opracowywane dla kogoś, kto jest użytkownikiem IE. Tak, testowałem w IE. Spróbuję tego w firefox ASAP, ale (z regresem) musi działać w IE. –

+0

Uruchomiłem powyższy kod zarówno w IE, jak i Firefoksie, a on wrócił. Spróbuj uruchomić to, co mam powyżej i zacznij dodawać elementy z tego miejsca. –

+0

spróbuję teraz. Zacząłem rezygnować z JSON. –

1

Zarzuty zauważają, że w pytaniu występuje błąd składni. Linia z

x.overrideMimeType("application/j-son;charset=UTF-8"); 

powinien przeczytać

x.overrideMimeType("application/json; charset=UTF-8"); 

To sprawia, że ​​zbyt duża różnica.

1

Usuń [], z przodu i ostatni na JsonData, i to działa.

+0

JSLint powie, że posiadanie JSON zaczynającego się od tablicy [] jest poprawne, czy jestem w błędzie? – Pierre

3

Jeśli ktoś nadal ma z tym problemy, to dlatego, że odpowiedź musi być ciągiem JSON i typem treści "application/json".

Przykład HTTP w asp.net (C#)

public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "application/json"; 
     context.Response.Write("{ status: 'success' }"); 
    } 

HTH,

Matti

0

I podano podobną błędu. Zajęło mi to trochę czasu, aby dowiedzieć się - niewiele wiedziałem, że PHP nie wspierało (natywnie) JSON od PHP5.2. Przypomnienie krytyczne ...

0

Wczoraj w $. Ajax nadal nie ma błędów, dziś cytowany jest błąd, niektórzy mówią wersję jquery parsererror problemu, używam jquery-1.3.2.min.js, wczoraj. To wydanie też się stało, dziś jest wyrzucone. Źródła danych: bez zmian. Nie wiesz, jaki jest powód?

+3

To wymagało dwóch czytań dla mnie. x-) –

0

Jest to być może dlatego, że bufor nie jest pusty, więc AJAX otrzymywać bajtów, które nie należą do JSON.

Spróbuj wyczyścić bufor przy pomocy ob_clean() po stronie serwera tuż przed wyjściem json z echo lub die(). Nie musisz określać wartości contentType, ale domyślna wartość będzie działać poprawnie.

Miałem ten sam problem i go rozwiązać.

Mam nadzieję, że ci pomogę.

0

w moim przypadku błąd został spowodowany przez znacznik html w jsonie.

niepoprawny (parsererror)

{"msg": "Gracias,<br>Nos pondremos en contacto."} 

POPRAWNIE

{"msg": "Gracias, nos pondremos en contacto."} 

Przeglądarka: IE7/IE8

+0

czy jest jakikolwiek sposób, jeśli moja odpowiedź na pewno zawiera tagi html dla IE7/IE8 – Gagan

0

również spróbować tej

$.ajax({ 
    url: url, 
    data:datas, 
    success:function(datas, textStatus, jqXHR){ 
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{'))); 
})}; 

w moim serwerze przypadku reaguje z charakterem nieznanego być dla e '{'

1

Oto działający przykład i przetestowany!

<script type="text/javascript"> 

function fetchData() { 
var dataurl = "pie.json"; 
$.ajax({ 
    url: dataurl, 
    cache: false, 
    method: 'GET', 
    dataType: 'json', 
    success: function(series) { 
     var data = []; 
     //alert(series.length); 
     for (var i=0; i<series.length;i++){ 
      data[i]=series[i]; 
     } 

     $.plot(
       $("#placeholder"), 
       data, 
       { 
        series: { 
         pie: { 
         show: true, 
         label: { 
          show: true 
         } 
        } 
        }, 
        legend: { 
         show: true 
        } 
        } 
     ); 
    } 
}); 

    //setTimeout(fetchData, 1000); 
} 
</script> 

i źródłem json jest następujący (pie.json):

[{ "label": "Series1", "data": 10}, 
{ "label": "Series2", "data": 30}, 
{ "label": "Series3", "data": 90}, 
{ "label": "Series4", "data": 70}, 
{ "label": "Series5", "data": 80}, 
{ "label": "Series6", "data": 110}] 
0

Nie używaj pola tablicy, i upewnij się, formatowanie danych odpowiednio:

{"account":{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}}