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 :
- Soit JText, ToString(texte).
- ...
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.
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".
1 votes
Pour info : "Même cité une seule fois" n'a aucune pertinence ici. Les guillemets simples et doubles autour d'un JavaScript n'ont aucune incidence sur sa validité en tant que JSON.
0 votes
@meagar - C'est en fait incorrect.
JSON.parse(['\'1234ab\'']);
(attention, seuls les guillemets simples sont utilisés) provoquera une erreur de syntaxe, alors queJSON.parse(['\"1234ab\"']);
se no . L'analyseur indique explicitement qu'il doit s'agir de guillemets doubles pour que le JSON soit correctement analysé.1 votes
@TravisJ Vous ne savez pas quelle partie est JavaScript et quelle partie est JSON. Les guillemets autour du JavaScript La chaîne n'a pas d'importance dans votre exemple, et vous avez choisi des guillemets simples pour les deux exemples, passant complètement à côté de l'essentiel. Les guillemets à l'intérieur de la chaîne JavaScript, qui font partie du JSON codé, sont absolument importants et je n'ai jamais indiqué qu'ils ne l'étaient pas. Les guillemets utilisés pour créer une chaîne littérale en JavaScript n'ont aucun impact sur le fait que les caractères de cette chaîne soient des caractères JSON valides ; il n'y a aucune différence entre l'analyse syntaxique de
'"foo"'
y"\"foo\""
il s'agit littéralement de cordes identiques.0 votes
@meagar - Vous vous trompez terriblement, et vous perpétuez votre malentendu avec votre réponse. Les citations à l'intérieur de sont le point entier . J'avais espéré que vous comprendriez bien sûr qu'il n'était pas nécessaire d'examiner les guillemets extérieurs. Il est clair que vous J'ai raté ce point . et ce faisant démontrer le manque de compréhension que votre commentaire précédent perpétue. C'est l'utilisation des guillemets à l'intérieur de la chaîne JSON qui est en cause ici, et non les simples guillemets qui entourent l'expression.
0 votes
@TravisJ Les "guillemets à l'intérieur" sont quelque chose. vous introduit à cette question. Il n'y a pas de "guillemets à l'intérieur" dans la question originale. L'utilisation des guillemets à l'intérieur de la chaîne JSON est le sujet ici. seulement pour toi . Personne d'autre n'en parle, y compris l'OP. Ni la question ni aucune autre réponse, y compris celle qui a été acceptée, n'a tout ce qui est à l'intérieur de la chaîne de caractères, et mon commentaire original auquel vous avez répondu n'avait certainement rien à voir avec cela. L'erreur ici est la vôtre, étant donné que tout le monde semble être sur la même longueur d'onde et que vous avez la seule réponse non séquentielle déclassée.
0 votes
@TravisJ Et enfin : Veuillez relire mon commentaire original, celui que vous avez qualifié d'incorrect. Il n'a rien à voir avec les guillemets JSON, à l'intérieur d'une chaîne JavaScript. Il est clairement dit que les guillemets simples et doubles "autour d'une chaîne JavaScript" n'ont aucune incidence sur sa validité en tant que JSON. Personne mais vous parlez de citations à l'intérieur de le littéral de la chaîne JavaScript.
0 votes
@meagar - Correct, personne n'a abordé correctement le formatage à l'intérieur du JSON analysé.