2010-11-19 6 views
1

Ce code échoue avec une exception indiquant JSON invalide:JSON Erreur d'analyse utilisant jQuery.parseJSON

var example = '{ "AKEY": undefined }'; 
jQuery.parseJSON(example); 

j'ai pu le réparer en remplaçant toutes les undefineds avec des chaînes vides. Les indéfinis ne font-ils pas partie de JSON?

Répondre

4

Si vous pouvez enrouler autour de votre tête cela, le jetonundefined est en réalité non défini. Permettez-moi d'élaborer: même si JavaScript a une valeur primitive spéciale appelée undefined, undefined est pas un mot clé JavaScript et n'a pas de signification particulière. Vous pouvez casser le code qui teste l'existence d'un objet en le comparant à undefined en le définissant.

var obj = { BKEY: 'I exist!' }; 
if (obj.AKEY == undefined) console.log ('no AKEY'); 
if (obj.BKEY == undefined) console.log ('should not happen'); 

undefined='uh oh'; 

if (obj.AKEY == undefined) console.log ('oops!'); // Logically, we want this to execute, but it will not! 
if (obj.BKEY == undefined) console.log ('should not happen'); 

La seule sortie de la console sera 'no AKEY'. Après avoir affecté à la variable globale undefined, obj.AKEY == undefined devient faux car undefined != 'uh oh'. obj.BKEY == undefined retourne toujours faux, mais seulement parce que nous sommes chanceux. Si j'avais défini obj.BKEY='uh oh', alors obj.BKEY == undefined serait vrai, même s'il existe réellement!

Vous souhaitez probablement définir explicitement AKEY à null. (Par ailleurs, nullest un mot-clé, null='uh oh' lève une exception).

Vous pouvez aussi tout simplement omettre AKEY de votre JSON, dans ce cas, vous trouverez:

typeof(example.AKEY) == 'undefined' 

(Si vous définissez AKEY à null, puis typeof(example.AKEY) == 'object'.)

La seule vraie différence entre le réglage à null et omettre est de savoir si vous voulez que la clé apparaisse dans une boucle foreach.

4

Non, mais null est. RFC 4627 §2.1:

Une valeur JSON doit être un objet, un tableau, le numéro , ou la chaîne, ou l'un des trois noms littéraux suivants:

false null true 
var example = '{ "AKEY": null }'; 
1

Ils ne sont pas autorisés dans JSON ... regarder l'alternative et il est clair que les raisons pour lesquelles:

var example = '{}'; 
var obj = jQuery.parseJSON(example); 
obj.AKEY //undefined 

Si c'est undefined, quand vous allez y accéder, il est le même que la clé même pas être présent. Puisque le but principal de JSON est de transmettre des données (sinon la syntaxe littérale de l'objet est plus large) ... il est préférable de ne rien y faire.

+0

Il existe * une * différence entre '{}' et '{AKEY: undefined}'. Avec ce dernier, 'AKEY' apparaîtra dans l'énumération' for each'. –

+0

@Matthew - Quand vous y accédez, il n'y a pas de différence ... pouvez-vous penser à un cas d'utilisation valide où vous voudriez le voir énuméré et prendre soin, étant donné qu'il n'est pas défini? –

+0

Non. Et cela simplifie définitivement les choses pour JSON juste pour avoir null. Je voulais juste noter qu'il y a une différence. –