Ich suche nach einer Lösung, die nicht verwendet wird try/catch weil ich meinen Debugger auf “bei allen Fehlern brechen” eingestellt habe und das dazu führt, dass er bei ungültigen JSON-Zeichenfolgen bricht.
Verwenden Sie nur 2 Zeilen, um es mit try catch zu überprüfen. var isValidJSON = wahr; try { JSON.parse(jsonString) } catch { isValidJSON = false; }
– efkan
30. August 2016 um 18:29 Uhr
Außerdem hatte ich hier geantwortet: stackoverflow.com/a/39236371/3765109
– efkan
4. Januar 2017 um 17:16 Uhr
Das funktioniert zwar, ist aber furchtbar klobig und schlechte Übung. Try/Catch ist für außergewöhnliches Verhalten und Fehlerbehandlung gedacht, nicht für den allgemeinen Programmablauf.
– Tasgall
26. Juni 2017 um 19:31 Uhr
@Tasgall In der Regel ja. Aber was tun, wenn der Try/Catch-Ansatz performanter ist als jeder validatorbasierte Ansatz? Gehen Sie mit der (manchmal erheblich) langsameren Option, nur weil die Alternative “schlechte Praxis” ist? An der Try/Catch-Methode ist funktionell nichts auszusetzen, also gibt es keinen Grund, sie nicht zu verwenden. Es ist wichtig, dass neue Programmierer gute Codierungsstandards entwickeln, aber es ist ebenso wichtig, das blinde Festhalten an herkömmlichen Richtlinien nicht zu verstärken, insbesondere in Fällen, in denen die Richtlinien die Dinge schwieriger machen, als sie sein müssen.
– Abion47
15. August 2018 um 17:53 Uhr
Matt H.
Ich weiß, dass ich mit dieser Frage 3 Jahre zu spät bin, aber ich wollte mich einmischen.
Die Lösung von Gumbo funktioniert zwar hervorragend, behandelt jedoch einige Fälle nicht, für die keine Ausnahme ausgelöst wird JSON.parse({something that isn't JSON})
Ich ziehe es auch vor, das geparste JSON gleichzeitig zurückzugeben, damit der aufrufende Code nicht aufrufen muss JSON.parse(jsonString) ein zweites Mal.
Das scheint für meine Bedürfnisse gut zu funktionieren:
/**
* If you don't care about primitives and only objects then this function
* is for you, otherwise look elsewhere.
* This function will return `false` for any valid json primitive.
* EG, 'true' -> false
* '123' -> false
* 'null' -> false
* '"I'm a string"' -> false
*/
function tryParseJSONObject (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
Von den Antworten auf der Seite ist dies die robusteste und zuverlässigste.
– Jonline
30. Mai 2014 um 17:07 Uhr
o && o !== null ist überflüssig.
– Aleksej Matjuschkin
21. Oktober 2014 um 15:21 Uhr
Dasselbe gilt für die Verwendung von triple-equals mit typeof, das immer einen String zurückgibt. 🙂
– Hein Haraldson Berg
3. Dezember 2014 um 16:09 Uhr
Obwohl es sich um einen alten Beitrag handelt, hielt ich es für sinnvoll, einen zu setzen Geige oben demonstrieren Sie Ihre Antwort @matth, bitte beachten Sie, dass Objekte nicht gültig sind. Sie müssen eine JSON-Zeichenfolge übergeben. Könnte für jeden nützlich sein, der anfängt, denke ich.
– Stapelunterlauf
25. Mai 2016 um 14:18 Uhr
Die Funktion sollte zurückkehren undefinednicht false da false ist eine gültige JSON-Zeichenfolge und es gibt keine Möglichkeit, zwischen ihnen zu unterscheiden tryParseJSON("false") und tryParseJSON("garbage")
– Sparebytes
22. Februar 2018 um 17:32 Uhr
IsJsonString(null); // gibt true zurück. Es kann durch Vergleichen behoben werden typeof str === 'string'
– Gramma
26. November 2019 um 8:54 Uhr
null repräsentiert den leeren Wert von an objectdas sieht aus meiner Sicht in Ordnung aus … es trifft möglicherweise nicht auf Ihr spezifisches Szenario zu, aber es ist, was es ist
– Höllenbaby
6. November 2020 um 8:18 Uhr
kukko
Ich habe eine wirklich einfache Methode verwendet, um eine Zeichenfolge zu überprüfen, ob es sich um ein gültiges JSON handelt oder nicht.
function testJSON(text){
if (typeof text!=="string"){
return false;
}
try{
var json = JSON.parse(text);
return (typeof json === 'object');
}
catch (error){
return false;
}
}
Ergebnis mit einem gültigen JSON-String:
var input="["foo","bar",{"foo":"bar"}]";
testJSON(input); // returns true;
Ergebnis mit einer einfachen Zeichenfolge;
var input="This is not a JSON string.";
testJSON(input); // returns false;
Ergebnis mit einem Objekt:
var input={};
testJSON(input); // returns false;
Ergebnis mit Nulleingabe:
var input=null;
testJSON(input); // returns false;
Die letzte gibt false zurück, da der Typ von Nullvariablen Objekt ist.
Das funktioniert immer. 🙂
JSON.parse(null), JSON.parse(“false”) löst keine Fehler aus, wahrscheinlich gibt es weitere Beispiele
– Klodom
15. März 2018 um 10:18 Uhr
Ja, du hast Recht, ich habe vergessen zu prüfen, ob die Eingabe ein String ist oder nicht, wenn ich das mache, diese Methode mit null Eingabe gibt es falsch zurück. Aber die „falsche“ Eingabe ist eine gültige JSON-Zeichenfolge. Darauf wird geparst boolean (false). Jetzt ändere ich den Code, um genauer zu sein.
– Kukko
16. März 2018 um 8:36 Uhr
Hier ist auch die Typoskript-Version:
JSONTryParse(input: any) {
try {
//check if the string exists
if (input) {
var o = JSON.parse(input);
//validate the result too
if (o && o.constructor === Object) {
return o;
}
}
}
catch (e: any) {
}
return false;
};
JSON.parse(null), JSON.parse(“false”) löst keine Fehler aus, wahrscheinlich gibt es weitere Beispiele
– Klodom
15. März 2018 um 10:18 Uhr
Ja, du hast Recht, ich habe vergessen zu prüfen, ob die Eingabe ein String ist oder nicht, wenn ich das mache, diese Methode mit null Eingabe gibt es falsch zurück. Aber die „falsche“ Eingabe ist eine gültige JSON-Zeichenfolge. Darauf wird geparst boolean (false). Jetzt ändere ich den Code, um genauer zu sein.
Verwendungszweck:isJSON({}) wird sein false, isJSON('{}') wird sein true.
Um zu überprüfen, ob etwas ein ist Array oder Object (geparst JSON):
// vanillaJS
function isAO(val) {
return val instanceof Array || val instanceof Object ? true : false;
}
// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;
Verwendungszweck:isAO({}) wird sein true, isAO('{}') wird sein false.
Seien Sie vorsichtig, da null besteht diese Validierung.
– Farzad Yousefzadeh
30. Mai 2017 um 7:33 Uhr
return !!(JSON.parse(str) && str); sollte Nullwerte blockieren. Ich werde die Antwort mit diesem Code aktualisieren.
– Machado
23. August 2017 um 20:08 Uhr
Dies ist die beste Antwort, da Sie damit auch überprüfen können, ob JSON vorhanden ist objektiviertund somit nicht das Bestehen der parse() Test, verursacht WTF’s.
– not2qubit
22. Februar 2018 um 13:33 Uhr
10107500cookie-checkWie überprüfe ich, ob eine Zeichenfolge eine gültige JSON-Zeichenfolge ist?yes
Für diejenigen, die neugierig sind, hier ist, wie die V8-Engine ihr JSON-Parsing durchführt: v8.googlecode.com/svn/trunk/src/json-parser.h
– BEIM
7. September 2014 um 7:57 Uhr
Verwenden Sie nur 2 Zeilen, um es mit try catch zu überprüfen. var isValidJSON = wahr; try { JSON.parse(jsonString) } catch { isValidJSON = false; }
– efkan
30. August 2016 um 18:29 Uhr
Außerdem hatte ich hier geantwortet: stackoverflow.com/a/39236371/3765109
– efkan
4. Januar 2017 um 17:16 Uhr
Das funktioniert zwar, ist aber furchtbar klobig und schlechte Übung. Try/Catch ist für außergewöhnliches Verhalten und Fehlerbehandlung gedacht, nicht für den allgemeinen Programmablauf.
– Tasgall
26. Juni 2017 um 19:31 Uhr
@Tasgall In der Regel ja. Aber was tun, wenn der Try/Catch-Ansatz performanter ist als jeder validatorbasierte Ansatz? Gehen Sie mit der (manchmal erheblich) langsameren Option, nur weil die Alternative “schlechte Praxis” ist? An der Try/Catch-Methode ist funktionell nichts auszusetzen, also gibt es keinen Grund, sie nicht zu verwenden. Es ist wichtig, dass neue Programmierer gute Codierungsstandards entwickeln, aber es ist ebenso wichtig, das blinde Festhalten an herkömmlichen Richtlinien nicht zu verstärken, insbesondere in Fällen, in denen die Richtlinien die Dinge schwieriger machen, als sie sein müssen.
– Abion47
15. August 2018 um 17:53 Uhr