Comment vérifier si une chaîne est une chaîne JSON valide en JavaScript sans utiliser Try / Catch

548

Quelque chose comme:

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

//should be true
IsJsonString(jsonString);

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

La solution ne doit pas contenir try / catch. Certains d'entre nous activent "pause sur toutes les erreurs" et ils n'aiment pas que le débogueur se casse sur ces chaînes JSON invalides.

Chi Chan
la source
25
Y a-t-il une raison valable de ne pas utiliser try?
Nick T
7
@NickT Parce que si vous activez "casser toutes les erreurs" dans le débogueur, ce sera le cas. Chrome a désormais la possibilité de supprimer les erreurs non détectées.
Chi Chan
6
Utilisez seulement 2 lignes pour le vérifier avec try catch. var isValidJSON = true; essayez {JSON.parse (jsonString)} catch {isValidJSON = false; }
efkan
18
Bien que cela fonctionne, c'est terriblement maladroit et une mauvaise pratique. Try / catch est destiné à un comportement exceptionnel et à la gestion des erreurs, et non au déroulement général du programme.
Tasgall
7
@Tasgall En règle générale, oui. Mais que faites-vous si l'approche try / catch est plus performante que toute approche basée sur un validateur? Allez-vous avec l'option (parfois considérablement) plus lente simplement parce que l'alternative est une «mauvaise pratique»? Il n'y a rien de mal fonctionnellement avec la méthode try / catch, il n'y a donc aucune raison de ne pas l'utiliser. Il est important que de nouveaux programmeurs développent de bonnes normes de codage, mais il est tout aussi important de ne pas renforcer l'adhésion aveugle aux directives conventionnelles, en particulier dans les cas où les directives rendent les choses plus difficiles qu'elles ne devraient l'être.
Abion47

Réponses:

172

Un commentaire d'abord. La question était de ne pas utiliser try/catch.
Si cela ne vous dérange pas de l'utiliser, lisez la réponse ci-dessous. Ici, nous vérifions simplement une JSONchaîne à l'aide d'une expression rationnelle, et cela fonctionnera dans la plupart des cas, pas dans tous les cas.

Jetez un œil à la ligne 450 dans https://github.com/douglascrockford/JSON-js/blob/master/json2.js

Il y a une expression rationnelle qui vérifie un JSON valide, quelque chose comme:

if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

  //the json is ok

}else{

  //the json is not ok

}

EDIT : La nouvelle version de json2.js fait une analyse plus avancée que ci-dessus, mais toujours basée sur un remplacement regexp (d'après le commentaire de @Mrchief )

Micro
la source
59
Cela vérifie uniquement si le code est sûr pour eval. Par exemple, la chaîne suivante «2011-6-27» réussirait ce test.
SystemicPlural
4
@SystemicPlural, oui mais la question était de ne pas utiliser try / catch
Mic
8
Vous ne pouvez pas tester si une chaîne est un JSON valide avec une expression régulière en JavaScript, car les expressions régulières JS ne prennent pas en charge les extensions nécessaires (expressions régulières récursives) qui vous permettent de le faire. Votre code ci-dessus échoue le "{".
Venge
2
@Mic json2.js n'utilise plus cette simple vérification (utilise à la place une analyse en 4 étapes pour déterminer un JSON valide). Suggère de réviser ou de supprimer votre réponse. Notez que je ne pense pas qu'il y ait quelque chose de mal à "ne pas avoir un try / catch comme seul mécanisme pour vérifier JSON" comme approche.
Mrchief
8
Tout simplement parce que cela l'aide, cela ne signifie pas que cela aide le reste d'entre nous, qui, des années plus tard, ont la même question.
McKay
917

Utilisez un analyseur JSON comme JSON.parse:

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
Gombo
la source
7
Merci, mais je viens de lancer cela avec l'équipe et ils veulent quelque chose qui n'utilise pas try / catch. La question est modifiée avec un nouveau titre. Désolé pour ça.
Chi Chan du
4
@trejder: il le fait parce que 1 n'est pas une chaîne, essayez-le avec "1"
Purefan
31
@Gumbo Mon commentaire a 1,5 ans! :] Je ne me souviens pas, ce que je faisais il y a deux semaines et vous me demandez de rappeler ce projet? :] Non, façon ...:]
trejder
9
Le problème avec cette réponse est que si la chaîne est extraite et que vous la analysez, vous l'avez analysée deux fois. Ne pourriez-vous pas à la place retourner false sur une mauvaise analyse, mais renvoyer l'objet en cas de succès?
Carcigenicate
5
@Carcigenicate Vous pouvez le faire. Cependant, JSON.parse("false")Equivaut à faux ainsi.
Gumbo
446

Je sais que j'ai 3 ans de retard par rapport à cette question, mais j'avais envie d'intervenir.

Bien que la solution de Gumbo fonctionne très bien, elle ne gère pas quelques cas où aucune exception n'est levée pour JSON.parse({something that isn't JSON})

Je préfère également renvoyer le JSON analysé en même temps, afin que le code appelant n'ait pas à appeler JSON.parse(jsonString)une deuxième fois.

Cela semble bien fonctionner pour mes besoins:

function tryParseJSON (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;
};
Matt H.
la source
9
Parmi les réponses sur la page, c'est la plus robuste et la plus fiable.
Jonline
28
o && o !== nullest superflu.
Aleksei Matiushkin
4
Il en va de même pour les triples égaux avec typeof, qui renvoie toujours une chaîne. :)
Hein Haraldson Berg
5
Bien qu'il s'agisse d'un ancien article, j'ai pensé qu'il valait la peine de mettre un violon pour montrer votre réponse @matth, veuillez noter que les objets ne seront pas valides .. vous devez passer une chaîne JSON. Cela pourrait être utile pour tous ceux qui débutent, je suppose.
MindVox
2
La fonction doit retourner undefined, non pas falseparce qu'il falses'agit d'une chaîne json valide et qu'il n'y a aucun moyen de différencier entre tryParseJSON("false")ettryParseJSON("garbage")
sparebytes
54
// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

Utilisation: isJSON({}) sera false, isJSON('{}')sera true.

Pour vérifier si quelque chose est un Arrayou Object( JSON analysé ):

// 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;

Utilisation: isAO({}) sera true, isAO('{}')sera false.

moeiscool
la source
4
Attention car nullpasse cette validation.
Farzad YZ
2
return !!(JSON.parse(str) && str);devrait bloquer les valeurs nulles. Je mettrai à jour la réponse avec ce code.
Machado
1
C'est la meilleure réponse, car elle vous permet également de vérifier si le JSON a été objectivé , et donc de ne pas passer le parse()test, provoquant des WTF.
not2qubit
30

Voici mon code de travail:

function IsJsonString(str) {
  try {
    var json = JSON.parse(str);
    return (typeof json === 'object');
  } catch (e) {
    return false;
  }
}
Anand Kumar
la source
1
IsJsonString (null); // renvoie vrai. Il peut être corrigé en comparanttypeof str === 'string'
gramcha
23

J'ai utilisé une méthode très simple pour vérifier si une chaîne est un JSON valide ou non.

function testJSON(text){
    if (typeof text!=="string"){
        return false;
    }
    try{
        JSON.parse(text);
        return true;
    }
    catch (error){
        return false;
    }
}

Résultat avec une chaîne JSON valide:

var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;

Résultat avec une chaîne simple;

var input='This is not a JSON string.';
testJSON(input); // returns false;

Résultat avec un objet:

var input={};
testJSON(input); // returns false;

Résultat avec entrée nulle:

var input=null;
testJSON(input); // returns false;

Le dernier retourne false car le type des variables nulles est object.

Cela fonctionne à chaque fois. :)

kukko
la source
1
JSON.parse (null), JSON.parse ("false") ne génère pas d'erreurs, il y a probablement d'autres exemples
klodoma
Ouais, tu as raison, j'ai oublié de vérifier comment l'entrée est une chaîne ou non, si je fais ça, cette méthode avec nullentrée rend faux. Mais l'entrée "false" est une chaîne JSON valide. Ce sera analysé boolean (false). Maintenant, je modifie le code pour être plus précis.
kukko
15

Dans prototypeJS, nous avons la méthode isJSON . Vous pouvez essayer ça. Même json pourrait aider.

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();
Si je
la source
9
Merci, mais je pense que l'utilisation de la bibliothèque de prototypes pour ce faire est un peu exagérée.
Chi Chan
4
Vous avez donné QUATRE exemples mais seulement TROIS résultats. Quel est le résultat "{ foo: 42 }".isJSON()? Si false, comme je le suppose (le résultat doit suivre la fonction du document), alors la bonne question est, pourquoi est-ce faux? { foo: 42 }semble être parfaitement JSON valide.
trejder
4
@trejder Malheureusement, la spécification JSON nécessite des clés entre guillemets.
mikermcneil
4
Et "2002-12-15" .isJSON renvoie true, tandis que JSON.parse ("2002-12-15") renvoie une erreur.
ychaouche
4
Je pense que la meilleure réponse ici serait de retirer cette fonction de la bibliothèque de prototypes et de la placer ici. Surtout que api.prototypejs.org/language/string/prototype/isjson est 404.
jcollum
5

De la String.isJSONdéfinition du cadre du prototype ici

/**
   *  String#isJSON() -> Boolean
   *
   *  Check if the string is valid JSON by the use of regular expressions.
   *  This security method is called internally.
   *
   *  ##### Examples
   *
   *      "something".isJSON();
   *      // -> false
   *      "\"something\"".isJSON();
   *      // -> true
   *      "{ foo: 42 }".isJSON();
   *      // -> false
   *      "{ \"foo\": 42 }".isJSON();
   *      // -> true
  **/
  function isJSON() {
    var str = this;
    if (str.blank()) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

c'est donc la version qui peut être utilisée en passant un objet chaîne

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

function isJSON(str) {
    if ( /^\s*$/.test(str) ) return false;
    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
    return (/^[\],:{}\s]*$/).test(str);
  }

console.log ("this is a json",  isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) )

console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) )

loretoparisi
la source
1
Quelqu'un a-t-il une suite de tests pour comparer toutes ces réponses? Je voudrais voir si celui-ci est correct.
Lonnie Best
1
@LonnieBest bon point. Mes 2 cents. Je l'ai utilisé pendant des années dans la production et cela a toujours fonctionné très bien et avec un temps d'exécution raisonnable.
loretoparisi
4

Cette réponse pour réduire le coût de l'instruction trycatch.

J'ai utilisé JQuery pour analyser les chaînes JSON et j'ai utilisé l'instruction trycatch pour gérer les exceptions, mais le lancement d'exceptions pour les chaînes non analysables a ralenti mon code, j'ai donc utilisé Regex simple pour vérifier la chaîne s'il s'agit d'une chaîne JSON possible ou non sans aller de plume en vérifiant sa syntaxe, j'ai ensuite utilisé la méthode habituelle en analysant la chaîne à l'aide de JQuery:

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

J'ai encapsulé le code précédent dans une fonction récursive pour analyser les réponses JSON imbriquées.

Rabih
la source
Que fait jQuery que JSON.parse () ne fait pas?
ADJenks
3

Peut-être que cela sera utile:

    function parseJson(code)
{
    try {
        return JSON.parse(code);
    } catch (e) {
        return code;
    }
}
function parseJsonJQ(code)
{
    try {
        return $.parseJSON(code);
    } catch (e) {
        return code;
    }
}

var str =  "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}";
alert(typeof parseJson(str));
alert(typeof parseJsonJQ(str));
var str_b  = "c";
alert(typeof parseJson(str_b));
alert(typeof parseJsonJQ(str_b));

production:

IE7: chaîne , objet, chaîne, chaîne

CHROME: objet, objet, chaîne, chaîne


la source
2

Je pense que je sais pourquoi vous voulez éviter cela. Mais peut-être essayer et attraper! == essayer et attraper. ; o) Cela m'est venu à l'esprit:

var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

Ainsi, vous pouvez également ajouter un clip sale à l'objet JSON, comme:

JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};

Comme cela est aussi encapsulé que possible, il ne peut pas se casser en cas d'erreur.

chrixle
la source
2

Voici également la version dactylographiée:

JSONTryParse(input) {
    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) {
    }

    return false;
};
Mohammed Zameer
la source
Le tapuscrit n'est pas javascript, mais votre réponse semble l'être.
Lonnie Best
1

var jsonstring='[{"ConnectionString":"aaaaaa","Server":"ssssss"}]';

if(((x)=>{try{JSON.parse(x);return true;}catch(e){return false}})(jsonstring)){

document.write("valide json")

}else{
document.write("invalide json")
}

safi eddine
la source
1

Je déduis du commentaire d'ouverture que le cas d'utilisation délimite si une réponse est HTML ou JSON. Dans ce cas, lorsque vous faites recevoir JSON, vous devriez probablement être l' analyse et la manipulation JSON invalide à un moment donné dans votre code de toute façon. En plus de tout, j'imagine que vous aimeriez être informé par votre navigateur si JSON était attendu mais JSON invalide reçu (tout comme les utilisateurs par proxy d'un message d'erreur significatif)!

Il n'est donc pas nécessaire de faire une regex complète pour JSON (comme ce serait - selon mon expérience - pour la plupart des cas d'utilisation). Vous feriez probablement mieux d'utiliser quelque chose comme ci-dessous:

function (someString) {
  // test string is opened with curly brace or machine bracket
  if (someString.trim().search(/^(\[|\{){1}/) > -1) {
    try { // it is, so now let's see if its valid JSON
      var myJson = JSON.parse(someString);
      // yep, we're working with valid JSON
    } catch (e) {
      // nope, we got what we thought was JSON, it isn't; let's handle it.
    }
  } else {
    // nope, we're working with non-json, no need to parse it fully
  }
}

cela devrait vous éviter d'avoir à gérer exceptionnellement du code non JSON valide et à prendre soin de duff json en même temps.

Jay Edwards
la source
Cette solution hybride semble être un moyen efficace d'éviter d'avoir à faire un essai de capture dans la plupart des cas non JSON. J'aime cet aspect de votre approche.
Lonnie Best
1
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

j'espère que cela fonctionne aussi pour vous

Darkcoder
la source
0
function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

S'il y a des erreurs, retournez false.

S'il n'y a pas d'erreur, renvoyez les données json

Emrah Tuncel
la source
4
Dans la question: "La solution ne doit pas contenir try / catch".
ddmps
1
Pourquoi? Ceci est garanti de façon ... Serait stupide de désaffecter! Je suis désolé de ne pas connaître l'anglais. J'ai utilisé Google Translate
Emrah Tuncel
Intéressant. Je voudrais voir une comparaison des performances de JSON.parse par rapport à cette solution basée sur eval. Pourtant, cela semble effrayant du point de vue de la sécurité / injection.
Lonnie Best
0

Vous pouvez utiliser la fonction javascript eval () pour vérifier si elle est valide.

par exemple

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
}

Alternativement, vous pouvez utiliser la JSON.parsefonction de json.org :

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

if (json) {
  //this is json
}

J'espère que cela t'aides.

AVERTISSEMENT : eval()est dangereux si quelqu'un ajoute du code JS malveillant, car il l'exécutera. Assurez-vous que la chaîne JSON est fiable , c'est-à-dire que vous l'avez obtenue d'une source fiable.

Modifier Pour ma 1ère solution, il est recommandé de le faire.

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

Pour garantir json-ness. Si le jsonStringJSON n'est pas pur, l'eval lèvera une exception.

Buhake Sindi
la source
Le premier exemple utilisant eval indique que "<div> foo </div>" est un JSON valide. Il peut fonctionner différemment dans différents navigateurs, mais il semble que dans FireFox, eval () accepte XML.
Mark Lutton,
Merci, mais je viens de lancer cela avec l'équipe et ils veulent quelque chose qui n'utilise pas try / catch. La question est modifiée avec un nouveau titre. Désolé pour ça.
Chi Chan du
@Mark Lutton, le type d'objet ne sera pas de JSON mais de XML Dom Document (j'ai oublié quel est le type exact dans Firefox).
Buhake Sindi du
1
eval accepte également le JavaScript valide, comme "alert (5);" et les chaînes entre guillemets simples, qui ne sont pas des JSON valides.
Mark Lutton,
12
Ceci est pur eval.
Chris Baker
0

Oh, vous pouvez certainement utiliser try catch pour vérifier s'il s'agit ou non d'un JSON valide

Testé sur Firfox Quantom 60.0.1

utilisez la fonction à l'intérieur d'une fonction pour tester le JSON et utilisez cette sortie pour valider la chaîne. entend un exemple.

    function myfunction(text){

       //function for validating json string
        function testJSON(text){
            try{
                if (typeof text!=="string"){
                    return false;
                }else{
                    JSON.parse(text);
                    return true;                            
                }
            }
            catch (error){
                return false;
            }
        }

  //content of your real function   
        if(testJSON(text)){
            console.log("json");
        }else{
            console.log("not json");
        }
    }

//use it as a normal function
        myfunction('{"name":"kasun","age":10}')
Aylian Craspa
la source
0

La fonction IsJsonString(str), qui utilise JSON.parse(str), ne fonctionne pas dans mon cas.
J'ai essayé de valider la sortie json de GraphiQL, elle retourne toujours false. Heureusement, isJSON fonctionne mieux:

var test = false;

$('body').on('DOMSubtreeModified', '.resultWrap', function() {

    if (!test) {   
        var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop();
        if isJSON(resultWrap) {test = !test;}
        console.log(resultWrap); 
        console.log(resultWrap.isJSON());
    }

});

Exemple de sortie:

THREE.WebGLRenderer 79
draw.js:170 {xxxxxxxxxx
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {xxxxxxxxxx 
draw.js:170 false
draw.js:170 {​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}​
draw.js:170 false
draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}
draw.js:170 true
Chetabahana
la source
0

Pour les personnes qui aiment la convention .Net des fonctions "try" qui renvoient un booléen et gèrent un paramètre byref contenant le résultat. Si vous n'avez pas besoin du paramètre out, vous pouvez l'omettre et utiliser simplement la valeur de retour.

StringTests.js

  var obj1 = {};
  var bool1 = '{"h":"happy"}'.tryParse(obj1); // false
  var obj2 = {};
  var bool2 = '2114509 GOODLUCKBUDDY 315852'.tryParse(obj2);  // false

  var obj3 = {};
  if('{"house_number":"1","road":"Mauchly","city":"Irvine","county":"Orange County","state":"California","postcode":"92618","country":"United States of America","country_code":"us"}'.tryParse(obj3))
    console.log(obj3);

StringUtils.js

String.prototype.tryParse = function(jsonObject) {
  jsonObject = jsonObject || {};
  try {
    if(!/^[\[{]/.test(this) || !/[}\]]$/.test(this)) // begin / end with [] or {}
      return false; // avoid error handling for strings that obviously aren't json
    var json = JSON.parse(this);
    if(typeof json === 'object'){
      jsonObject.merge(json);
      return true;
    }
  } catch (e) {
    return false;
  }
}

ObjectUtils.js

Object.defineProperty(Object.prototype, 'merge', {
  value: function(mergeObj){
    for (var propertyName in mergeObj) {
      if (mergeObj.hasOwnProperty(propertyName)) {
        this[propertyName] = mergeObj[propertyName];
      }      
    }
    return this;
  },
  enumerable: false, // this is actually the default
});
toddmo
la source
-2

Code simple simple (approche Hacky)

if (expected_json.id === undefined){
   // not a json
}
else{
   // json
}

REMARQUE: cela ne fonctionne que si vous attendez quelque chose comme une chaîne JSON comme id. Je l'utilise pour une API et j'attends le résultat soit en JSON soit en une chaîne d'erreur.

Abhishek Goel
la source