2015-01-06 35 views
6

OK, więc próbuję pobrać dane z pliku json, który ma status kilku diod LED itp. Mam skrypt który uruchamia się kilka razy na sekundę i pobiera dane, a strona internetowa ładuje je. Problem polega na tym, że po około 20-krotnym czasie odczytywania pliku json przez serwer, ten błąd zostanie zgłoszony.SyntaxError: JSON.parse: nieoczekiwany koniec danych w wierszu 1 kolumny 1 danych JSON

SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data

// For toggling the LED/switch status indicators using the json data 
$(document).ready(function() { 
    (function worker() { 
     $.ajax({ 
      url: 'server_info.json', 
      success: function(data) { 
       var json = $.parseJSON(data); 
       console.log(json); 
       if (json.led_1 == "off") { 
        // do stuff 
       }   
       if (json.led_2 == "off") { 
        // do stuff 
       } 
       if (json.led_3 == "off") { 
        // do stuff 
       }   
      }, 
      complete: function() { 
       // Schedule the next request when the current one's complete 
       setTimeout(worker, 250); 
      } 
     }); 
    })(); 
}); 

plik json wygląda następująco:

{ "led_1": "on", "led_2": "on", "led_3": "on" } 

Wydaje mi się, że dane JSON jest zawsze prawidłowo sformatowany. Nie rozumiem, skąd pochodzi błąd. Jakieś pomysły?

+0

Albo rzucić przerwania na początku funkcji, lub obserwować ruch sieciowy na karcie sieciowej, i zobaczyć, co dane wygląda jak przed błędem. Jeśli dzieje się to tylko raz na 20, Twój kod prawdopodobnie jest w porządku, a dane nie mogą być podawane poprawnie. –

+1

Czy sprawdziłeś, jakie dane są przed błędem? 'console.log (dane);' Czy jesteś pewien, że serwer nie zwraca czegoś innego? – epascarello

+0

Czasami uzyskuję sesję tmp, aby usunąć komunikat o błędzie po kilku żądaniach. Może coś zepsuje odpowiedź. – Mouser

Odpowiedz

3

Użyj ustawienia "dataType", aby określić typ odpowiedzi, aby wywołanie funkcji .ajax() znało JSON i nie trzeba było zgadywać.

Może to nie rozwiązać problemu, ponieważ najprawdopodobniej Twoja odpowiedź nie zwróci JSON-a dla wywołania, które powoduje błąd. Jeśli dodasz ustawienie błędu, możesz zobaczyć, co serwer zwraca po błędzie, ale jeśli żądania zakończą się, sprawdź konsolę pod kątem tego, co powraca z serwera. Jak już powiedziałem, najprawdopodobniej nie JSON, jeśli otrzymujesz ten błąd z $ .parseJSON() na początek.

$(document).ready(function() { 
    (function worker() { 
     $.ajax({ 
      url: 'server_info.json', 
      dataType: 'json', 
      success: function(data) { 
       console.log(data); 
       if (data.led_1 == "off") { 
        // do stuff 
       }   
       if (data.led_2 == "off") { 
        // do stuff 
       } 
       if (data.led_3 == "off") { 
        // do stuff 
       }   
      }, 
      error: function(data, status, error) { 
       console.log(data); 
       console.log(status); 
       console.log(error); 
      } 
      complete: function() { 
       // Schedule the next request when the current one's complete 
       setTimeout(worker, 250); 
      } 
     }); 
    })(); 
}); 
+0

Mam ten błąd, gdy moja procedura php wysyłała pusty ciąg, console.log (output) pokazał pusty ciąg; błąd polegał na tym, że moja metoda php nie była nawet wywoływana i nadal mam pusty ciąg znaków. –

+0

Jaki był dokładny błąd, który otrzymałeś? – zgr024

0

Podczas korzystania z debugowania Firefoksa mogłem zauważyć, że zwracany typ wartości był niezdefiniowany, gdy wystąpiłby ten błąd. Sprawdzanie wartości null/undefined w pierwszej analizowanej wartości, a następnie jeśli warunek jest fałszywy, kontynuuj parsowanie, w przeciwnym razie status obsługi rozwiązał mój problem.

0

Po długim czasie szukałem rozwiązania tego problemu i nie znalazłem sposobu, jak to naprawić, próbowałem zmodyfikować mój plik instalacyjny mysql (my.ini) na własną rękę w następujący sposób. I to działa!

Jedyne co zrobiłem to odkomentowac ten akapit:

## UTF 8 Settings 
init-connect=\'SET NAMES utf8\' 
collation_server=utf8_unicode_ci 
character_set_server=utf8 
skip-character-set-client-handshake 
character_sets-dir="C:/xampp/mysql/share/charsets" 
Powiązane problemy