74 votes

Pourquoi JSON.parse(['1234']) renvoie-t-il 1234 ?

J'ai du mal à comprendre le comportement de JSON.parse . JSON.parse devrait fonctionner uniquement pour les chaînes de caractères. Mais cela semble fonctionner pour un tableau qui ne contient qu'une seule chaîne de caractères (même entre guillemets), si la chaîne ne contient que des chiffres.

JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error

2 votes

Je sais qu'aucun d'entre eux n'est pas un JSON valide. Mais alors JSON.parse devrait lancer une erreur, comme je m'y attendais dans le premier cas, mais ce n'est pas le cas.

57 votes

S'IL VOUS PLAÎT ne vous référez pas à w3schools pour comprendre JSON. Je viens de le revoir et il est tellement faux à bien des égards.

2 votes

Aussi, je pense que ce que Solomonoff voulait dire était "C'est JavaScript. Vous devez vous attendre à ce qu'il soit conforme à la spécification ECMAScript qui explique exactement ce qui se passe lorsque vous passez une variable non-String dans une fonction qui attend une String".

178voto

BoltClock Points 249668

Comme vous l'avez souligné, JSON.parse() s'attend à une chaîne et non à un tableau. Cependant, lorsqu'on lui donne un tableau ou toute autre valeur qui n'est pas une chaîne de caractères, la méthode la convertit automatiquement en chaîne de caractères et continue au lieu de la rejeter immédiatement. Depuis le spec :

  1. Soit JText, ToString(texte).
  2. ...

La représentation en chaîne d'un tableau est constituée de ses valeurs, délimitées par des virgules. Ainsi,

  • String(['1234']) renvoie à '1234' ,
  • String(['1234as']) renvoie à '1234as' et
  • String(['123', '123']) renvoie à '123,123' .

Remarquez que les valeurs des chaînes ne sont pas à nouveau citées. Cela signifie que ['1234'] y [1234] Les deux convertissent en la même chaîne, '1234' .

Donc ce que tu fais vraiment c'est :

JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')

1234as y 123,123 ne sont pas des JSON valides, et donc JSON.parse() dans les deux cas. (Le premier n'est pas une syntaxe JavaScript légale pour commencer, et le second contient un opérateur virgule qui n'a pas sa place).

1234 d'autre part, est un nombre littéral et donc un JSON valide, qui se représente lui-même. Et c'est pourquoi JSON.parse('1234') (et par extension JSON.parse(['1234']) ) renvoie la valeur numérique 1234.

12 votes

" est un nombre littéral et donc un JSON valide " - Un seul littéral numérique n'est pas un JSON valide, mais JSON.parse n'est pas très stricte (plus précisément, il analyse les objets JSON et les valeurs uniques) . Voir aquí pour plus d'informations.

18 votes

@BlueRaja-DannyPflughoeft J'ai suivi votre lien. Il ne correspond pas à votre conclusion. Si par "JSON valide" vous entendez "un texte JSON valide", alors un littéral numérique unique était invalide, mais est maintenant valide. De plus, "JSON valide" a d'autres interprétations valides que "un texte JSON valide", et selon certaines de ces autres interprétations, un seul chiffre littéral a toujours été valide.

11 votes

On peut passer à la vitesse supérieure avec JSON.parse(['[123', '123]']) :P

22voto

naortor Points 1431

Si JSON.parse n'obtient pas de chaîne, il convertit d'abord l'entrée en chaîne.

["1234"].toString() // "1234"
["1234as"].toString() // "1324as"
["123","123"].toString() // "123,123"

De toutes ces sorties, il ne sait que comment analyser "1234".

4voto

Salman A Points 60620

Deux choses à noter ici :

1) JSON.parse convertit l'argument en une chaîne de caractères (se référer à la première étape de l'algorithme dans la spécification). Votre entrée donne le résultat suivant :

['1234']       // String 1234
['1234as']     // String 1234as
['123', '123'] // String 123,123

2) Les spécifications à json.org déclare que :

[...] Une valeur peut être une chaîne de caractères entre guillemets doubles, un nombre ou une valeur réelle. ou false ou null, ou un objet ou un tableau. Ces structures peuvent être imbriquées.

Donc nous avons :

JSON.parse(['1234'])
// Becomes JSON.parse("1234")
// 1234 could be parsed as a number
// Result is Number 1234 

JSON.parse(['1234as'])
// Becomes JSON.parse("1234as")
// 1234as cannot be parsed as a number/true/false/null
// 1234as cannot be parsed as a string/object/array either
// Throws error (complains about the "a")

JSON.parse(['123', '123'])
// Becomes JSON.parse("123,123")
// 123 could be parsed as a number but then the comma is unexpected
// Throws error (complains about the ",")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X