Comment puis-je vérifier si une valeur est un objet json?

mon code côté serveur renvoie une valeur qui est un objet json sur le succès et une chaîne 'false' sur l'échec. Maintenant, comment puis-je vérifier si la valeur retournée est un objet json?

92
demandé sur bart 2010-11-28 07:34:05

12 réponses

jQuery.parseJSON () devrait retourner un objet de type "object", si la chaîne était JSON, donc vous n'avez qu'à vérifier le type avec typeof

var response=jQuery.parseJSON('response from server');
if(typeof response =='object')
{
  // It is JSON
}
else
{
  if(response ===false)
  {
     // the response was a string "false", parseJSON will convert it to boolean false
  }
  else
  {
    // the response was something else
  }
}
90
répondu Dr.Molle 2017-11-06 01:39:32

La solution choisie ne fonctionne pas pour moi parce que je suis un

     "Unexpected Token <" 

erreur dans Chrome. C'est parce que l'erreur est lancée dès que l'analyse tombe et caractère inconnu. Cependant, il y a un moyen de contourner cela si vous retournez seulement des valeurs de chaîne par ajax (ce qui peut être assez utile si vous utilisez PHP ou ASPX pour traiter les requêtes ajax et pourrait ou ne pourrait pas retourner JSON selon les conditions)

la solution est assez simple, vous pouvez faire ce qui suit pour vérifier si c'était un retour JSON valide

       var IS_JSON = true;
       try
       {
               var json = $.parseJSON(msg);
       }
       catch(err)
       {
               IS_JSON = false;
       }                

comme je l'ai déjà dit, c'est la solution pour si vous retournez du matériel de type string à partir de votre requête AJAX ou si vous retournez du matériel de type mixte.

136
répondu Serguei Fedorov 2017-05-23 12:17:58

la meilleure façon de valider qu'un objet est de type JSON ou array est la suivante:

var a = [],
    o = {};

Solution 1

toString.call(o) === '[object Object]'; // true
toString.call(a) === '[object Array]'; // true

Solution 2

a.constructor.name === 'Array'; // true
o.constructor.name === 'Object'; // true

mais, à proprement parler, un tableau fait partie d'une syntaxe JSON. Par conséquent, les deux exemples suivants font partie d'une réponse de JSON:

console.log(response); // {"message": "success"}
console.log(response); // {"user": "bart", "id":3}

et:

console.log(response); // [{"user":"chofoteddy"}, {"user":"bart"}]
console.log(response); // ["chofoteddy", "bart"]

Même un simple opérateur Booléen ou un entier peut être considéré comme valide dans la syntaxe JSON. Cela nous mènerait alors à bien d'autres validations. Par conséquent, la façon la plus pratique de vérifier si quelque chose a une syntaxe JSON serait:

Solution 3 (populaire)

function isJSON (something) {
    if (typeof something != 'string')
        something = JSON.stringify(something);

    try {
        JSON.parse(something);
        return true;
    } catch (e) {
        return false;
    }
}

vous pouvez l'utiliser:

var myJson = [{"user":"chofoteddy"}, {"user":"bart"}];
isJSON(myJson); // true

AJAX / JQuery (recommended)

si vous utilisez JQuery pour apporter des informations via AJAX. Je vous recommande de mettre dans le "dataType" attribuent la valeur "json", de cette façon si vous obtenez un JSON ou non, JQuery Le Valider pour vous et le faire connaître à travers leurs fonctions" succès "et"erreur". Exemple:

$.ajax({
    url: 'http://www.something.com',
    data: $('#formId').serialize(),
    method: 'POST',
    dataType: 'json',
    // "sucess" will be executed only if the response status is 200 and get a JSON
    success: function (json) {},
    // "error" will run but receive state 200, but if you miss the JSON syntax
    error: function (xhr) {}
});
13
répondu Chofoteddy 2018-06-11 16:18:09

si vous avez jQuery, utilisez isPlainObject .

if ($.isPlainObject(my_var)) {}
12
répondu thnee 2015-04-14 11:50:01
var checkJSON = function(m) {

   if (typeof m == 'object') { 
      try{ m = JSON.stringify(m); }
      catch(err) { return false; } }

   if (typeof m == 'string') {
      try{ m = JSON.parse(m); }
      catch (err) { return false; } }

   if (typeof m != 'object') { return false; }
   return true;

};


checkJSON(JSON.parse('{}'));      //true
checkJSON(JSON.parse('{"a":0}')); //true
checkJSON('{}');                  //true
checkJSON('{"a":0}');             //true
checkJSON('x');                   //false
checkJSON('');                    //false
checkJSON();                      //false
6
répondu luizhp 2016-08-12 21:18:40

puisque c'est juste false et JSON object, pourquoi ne pas vérifier si c'est false, sinon ça doit être json.

if(ret == false || ret == "false") {
    // json
}
4
répondu Andreas Wong 2010-11-28 08:02:13

je sais que ce fil a déjà été répondu, mais venir ici n'a pas vraiment résolu mes problèmes, j'ai trouvé cette fonction ailleurs. peut-être que quelqu'un qui vient ici le trouvera utile pour eux;

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}
2
répondu pythonian29033 2013-08-13 09:35:44
var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

if(jdata)
{
//use jdata
}else
{
//use data
}
1
répondu Firas Abd Alrahman 2013-08-31 14:02:12

si vous voulez tester explicitement pour JSON valide (par opposition à l'absence de la valeur retournée false ), alors vous pouvez utiliser une approche d'analyse comme décrit ici .

0
répondu Ken Redler 2017-05-23 12:34:30

Je n'aime pas vraiment la réponse acceptée. D'abord et avant tout, il nécessite jQuery, qui n'est pas toujours disponible ou nécessaire. Deuxièmement, il fait une stringification complète de l'objet qui pour moi est exagérée. Voici une fonction simple qui détecte minutieusement si une valeur est semblable à JSON, en utilisant rien de plus que quelques parties de la bibliothèque lodash pour la généricité.

import * as isNull from 'lodash/isNull'
import * as isPlainObject from 'lodash/isPlainObject'
import * as isNumber from 'lodash/isNumber'
import * as isBoolean from 'lodash/isBoolean'
import * as isString from 'lodash/isString'
import * as isArray from 'lodash/isArray'

function isJSON(val) {
  if (isNull(val)
   || isBoolean(val)
   || isString(val))
    return true;
  if (isNumber(val)) 
     return !isNaN(val) && isFinite(val)
  if (isArray(val))
    return Array.prototype.every.call(val, isJSON)
  if (isPlainObject(val)) {
    for (const key of Object.keys(val)) {
      if (!isJSON(val[key]))
        return false
    }
    return true
  }
  return false
}

j'ai même pris le temps de le mettre en npm comme un paquet: https://npmjs.com/package/is-json-object . Utilisez-le avec quelque chose comme Webpack pour entrer dans le navigateur.

Espérons que cela aide quelqu'un!

0
répondu samvv 2017-12-05 21:22:39

j'utilise ceci pour valider L'objet JSON

function isJsonObject(obj) {
    try {
        JSON.parse(JSON.stringify(obj));
    } catch (e) {
        return false;
    }
    return true;
}

j'utilise ceci pour valider la chaîne JSON

function isJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
0
répondu Abhishek Goel 2018-04-10 06:24:29

vous devez retourner json toujours , mais changer son statut , ou dans l'exemple suivant le code de responsabilité propriété:

if(callbackResults.ResponseCode!="200"){
    /* Some error, you can add a message too */
} else {
    /* All fine, proceed with code */
};
-1
répondu kobe 2015-04-06 12:45:13