Wie überprüfe ich, ob eine Zeichenfolge eine gültige JSON-Zeichenfolge ist?

Lesezeit: 6 Minuten

Benutzer-Avatar
Chi Chan

isJsonString('{ "Id": 1, "Name": "Coke" }')

sollte sein true und

isJsonString('foo')
isJsonString('<div>foo</div>')

sollte sein false.

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.

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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.

    – Kukko

    16. März 2018 um 8:36 Uhr

Benutzer-Avatar
Machado

// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

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

1010750cookie-checkWie überprüfe ich, ob eine Zeichenfolge eine gültige JSON-Zeichenfolge ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy