Πώς να ελέγξετε αν μια συμβολοσειρά είναι έγκυρη συμβολοσειρά JSON σε JavaScript χωρίς τη χρήση Try/Catch

Κάτι σαν:

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

Η λύση δεν πρέπει να περιέχει try/catch. Κάποιοι από εμάς ενεργοποιούν το "break on all errors" και δεν τους αρέσει να σπάει ο αποσφαλματωτής σε αυτές τις άκυρες συμβολοσειρές JSON.

Χρησιμοποιήστε έναν αναλυτή JSON όπως το JSON.parse:

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
Σχόλια (14)

Στο prototypeJS, έχουμε τη μέθοδο isJSON. Μπορείτε να τη δοκιμάσετε. Ακόμα και η json μπορεί να βοηθήσει.

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();
Σχόλια (5)

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση javascript eval() για να ελέγξετε αν είναι έγκυρο.

π.χ.

var jsonString = '{ "Id": 1, "Name": "Coke" }';
var json;

try {
  json = eval(jsonString);
} catch (exception) {
  //It's advisable to always catch an exception since eval() is a javascript executor...
  json = null;
}

if (json) {
  //this is json
}

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τη συνάρτηση JSON.parse από το json.org:

try {
  json = JSON.parse(jsonString);
} catch (exception) {
  json = null;
}

if (json) {
  //this is json
}

Ελπίζω αυτό να σας βοηθήσει.

ΠΡΟΕΙΔΟΠΟΙΗΣΗ: eval() είναι επικίνδυνο αν κάποιος προσθέσει κακόβουλο κώδικα JS, αφού θα τον εκτελέσει. Βεβαιωθείτε ότι το JSON String είναι αξιόπιστο, δηλαδή το πήρατε από μια αξιόπιστη πηγή.

Επεξεργασία Για την 1η λύση μου, συνιστάται να το κάνετε αυτό.

 try {
      json = eval("{" + jsonString + "}");
    } catch (exception) {
      //It's advisable to always catch an exception since eval() is a javascript executor...
      json = null;
    }

Για να εγγυηθεί η json-ικότητα. Αν το jsonString δεν είναι καθαρό JSON, η eval θα πετάξει μια εξαίρεση.

Σχόλια (11)