web-dev-qa-db-fra.com

SyntaxError: JSON.parse: fin inattendue des données à la ligne 1, colonne 1 des données JSON

D'accord, j'essaie d'extraire des données d'un fichier json qui contient le statut de quelques voyants, etc. J'ai un script qui s'exécute quelques fois par seconde et extrait les données et la page Web les charge. Le problème est qu'après environ 20+ fois que le serveur a lu le fichier json, il finira par générer cette erreur.

SyntaxError: JSON.parse: fin inattendue des données à la ligne 1, colonne 1 des données JSON

// 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);
            }
        });
    })();
});

Le fichier json ressemble à ceci:

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

Il me semble que les données json sont toujours correctement formatées. Je ne comprends pas d'où vient l'erreur. Des idées?

11
z470

Utilisez le paramètre "dataType" pour identifier le type de réponse afin que l'appel .ajax () connaisse son JSON et n'a pas besoin de deviner.

Cela peut ne pas résoudre le problème car il est probable que votre réponse ne renvoie pas JSON pour l'appel qui génère l'erreur. Si vous ajoutez le paramètre d'erreur, vous pouvez voir ce que le serveur renvoie en cas d'erreur, mais si les demandes se terminent, vérifiez la console pour savoir ce qui revient du serveur. Comme je l'ai dit, ce n'est probablement pas JSON si vous obtenez cette erreur de $ .parseJSON () pour commencer.

$(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);
            }
        });
    })();
});
7
zgr024

En utilisant le débogage de Firefox, j'ai pu voir que le type de valeur qui revenait n'était pas défini lorsque j'obtiendrais cette erreur. Faire une vérification pour un null/undefined sur la valeur à analyser en premier, puis si la condition est fausse, procéder à l'analyse, sinon gérer la condition a résolu mon problème.

4
eaglei22

Il s'avère que l'erreur n'a rien à voir avec JSON. C'est en fait à cause du backend retournant soit un JSON non, soit une chaîne vide.

// Update
    if(updateFile($id,$author)) {
      echo json_encode(
        array('message' => 'Post Updated')
      );
    } else {
      echo json_encode(
        array('message' => 'Post Not Updated')
      );
    }

Quant à moi, cela a fonctionné. Bonne chance

2
james ace