Frage Warum gibt JSON.parse (['1234']) 1234 zurück?


Ich habe Probleme, das Verhalten von zu verstehen JSON.parse. JSON.parse sollte nur für Strings funktionieren. Aber es scheint für ein Array zu funktionieren, das nur eine Zeichenkette enthält (sogar einzelne zitierte), wenn die Zeichenkette nur Zahlen enthält.

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

75
2018-05-01 10:57


Ursprung


Antworten:


Wie du schon gesagt hast, JSON.parse() erwartet eine Zeichenfolge und kein Array. Wenn Sie jedoch ein Array oder einen anderen Nicht-String-Wert erhalten, wird die Methode automatisch zu einer Zeichenkette gezwungen und fortgefahren, anstatt sofort zu werfen. Von dem Spez:

  1. Sei JText ToString (Text).
  2. ...

Die Zeichenfolgendarstellung eines Arrays besteht aus seinen Werten, die durch Kommata getrennt sind. Damit

  • String(['1234']) kehrt zurück '1234',
  • String(['1234as']) kehrt zurück '1234as', und
  • String(['123', '123']) kehrt zurück '123,123'.

Beachten Sie, dass Zeichenfolgenwerte nicht erneut zitiert werden. Das bedeutet, dass ['1234'] und [1234] beide konvertieren in die gleiche Zeichenfolge, '1234'.

Was du wirklich tust ist:

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

1234as und 123,123 sind nicht gültig JSON und so JSON.parse() wirft in beiden Fällen. (Ersteres ist keine legale JavaScript-Syntax, und letzteres enthält einen Komma-Operator, der nicht dazugehört.)

1234 Auf der anderen Seite steht ein Zahlenliteral und damit gültiger JSON, der sich selbst darstellt. Und deshalb JSON.parse('1234') (und durch Erweiterung JSON.parse(['1234'])) gibt den numerischen Wert 1234 zurück.


179
2018-05-01 11:04



Wenn JSON.parse keine Zeichenfolge erhält, konvertiert sie zuerst die Eingabe in eine Zeichenfolge.

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

Von all diesen Ausgaben kann nur "1234" analysiert werden.


21
2018-05-01 11:05



Zwei Dinge, die hier zu beachten sind:

1) JSON.parse wandelt das Argument in eine Zeichenfolge um (siehe den ersten Schritt des Algorithmus in der Spezifikation). Ihre Eingabe führt zu folgendem:

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

2) Die Spezifikationen bei json.de erklären, dass:

[...] Ein Wert kann eine Zeichenfolge in Anführungszeichen oder eine Zahl oder wahr sein   oder false oder null oder ein Objekt oder ein Array. Diese Strukturen können sein   verschachtelt.

Also haben wir:

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 ",")

4
2018-05-02 10:08