Warnung: Bei Methoden, die sich auf JSON.parse
- Arrays und in Anführungszeichen umgebene Zeichenfolgen verlassen, werden diese ebenfalls übergeben (z. B. console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
).
Um alle Nicht-Objekt-JSON-Grundelemente (Boolescher Wert, Nullwert, Array, Zahl, Zeichenfolge) zu vermeiden, empfehle ich Folgendes:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Code Erklärung
- !! o - Nicht falsch (ausgenommen null, das als Typ von 'Objekt' registriert wird)
- (typeof o === 'object') - Schließt Boolesche Werte , Zahlen und Zeichenfolgen aus
- ! Array.isArray (o) - Arrays ausschließen (die sich als Typ von 'Objekt' registrieren)
- try ... JSON.stringify / JSON.parse - Fordert die JavaScript-Engine auf, festzustellen, ob JSON gültig ist
Warum nicht die Antwort hasJsonStructure () verwenden?
Sich darauf zu verlassen toString()
ist keine gute Idee. Dies liegt daran, dass verschiedene JavaScript-Engines möglicherweise eine andere Zeichenfolgendarstellung zurückgeben. Im Allgemeinen können Methoden, die darauf basieren, in verschiedenen Umgebungen fehlschlagen oder später fehlschlagen, falls die Engine jemals das Ergebnis der Zeichenfolge ändert
Warum ist das Fangen einer Ausnahme kein Hack?
Es wurde darauf hingewiesen, dass das Abfangen einer Ausnahme zur Bestimmung der Gültigkeit von etwas niemals der richtige Weg ist. Dies ist im Allgemeinen ein guter Rat, aber nicht immer. In diesem Fall ist das Abfangen von Ausnahmen wahrscheinlich der beste Weg, da es auf der Implementierung der JSON-Daten durch die JavaScript-Engine beruht.
Das Verlassen auf die JS-Engine bietet die folgenden Vorteile:
- Gründlicher und ständig auf dem neuesten Stand, wenn sich die JSON-Spezifikationen ändern
- Läuft wahrscheinlich schneller (da es sich um Code auf niedrigerer Ebene handelt)
Wenn Sie die Möglichkeit haben, sich auf die JavaScript-Engine zu stützen, würde ich vorschlagen, dies zu tun. Besonders in diesem Fall. Obwohl es sich hackig anfühlt, eine Ausnahme abzufangen, behandeln Sie wirklich nur zwei mögliche Rückgabezustände von einer externen Methode.
eval()
wenn esundefined
dann zurückkehrt , ist es nicht JSON