代码之家  ›  专栏  ›  技术社区  ›  bart

如何检查值是否为json对象?

  •  97
  • bart  · 技术社区  · 14 年前

    我的服务器端代码返回一个值,成功时为json对象,失败时为字符串“false”。现在如何检查返回的值是否是json对象?

    12 回复  |  直到 14 年前
        1
  •  99
  •   Muhammad Omar ElShourbagy    7 年前

    如果字符串是JSON,那么jQuery.parseJSON()应该返回“object”类型的对象,因此您只需使用 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
      }
    }
    
        2
  •  144
  •   Community miroxlav    7 年前

    The chosen solution 实际上对我不起作用,因为我

         "Unexpected Token <" 
    

    Chrome出错。这是因为一旦解析遇到未知字符,就会抛出错误。但是,如果只通过ajax返回字符串值(如果使用PHP或ASPX处理ajax请求,并且可能返回,也可能不返回JSON,这一点非常有用,具体取决于条件)

    解决方案非常简单,您可以执行以下操作来检查它是否是有效的JSON返回

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

    如前所述,如果您从AJAX请求返回字符串类型的内容,或者返回混合类型,那么这就是解决方案。

        3
  •  17
  •   Chofoteddy    6 年前

    解决方案3(最快方式)

    /**
     * @param Object
     * @returns boolean
     */
    function isJSON (something) {
        if (typeof something != 'string')
            something = JSON.stringify(something);
    
        try {
            JSON.parse(something);
            return true;
        } catch (e) {
            return false;
        }
    }
    

    你可以使用它:

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

    验证对象是JSON或array类型的最佳方法如下:

    var a = [],
        o = {};
    

    解决方案1

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

    解决方案2

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

    但是,严格地说,数组是JSON语法的一部分。因此,以下两个示例是JSON响应的一部分:

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

    以及:

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

    AJAX/JQuery(推荐)

    如果您使用JQuery通过AJAX带来信息。我建议您在“dataType”属性中输入“json”值,这样,如果您得到了一个json或没有,JQuery就会为您验证它,并通过它们的函数“success”和“error”使之为人所知。例子:

    $.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) {}
    });
    
        4
  •  13
  •   thnee    9 年前

    如果有jQuery,请使用 isPlainObject .

    if ($.isPlainObject(my_var)) {}
    
        5
  •  6
  •   luizhp    8 年前
    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
  •  4
  •   Andreas Wong    14 年前

    既然它只是false和json对象,为什么不检查它是否为false,否则它必须是json。

    if(ret == false || ret == "false") {
        // json
    }
    
        7
  •  2
  •   pythonian29033    11 年前

    我知道这个线程已经被回答了,但是来到这里并没有真正解决我的问题,我在其他地方找到了这个函数。 也许来这里的人会觉得这对他们有帮助;

    function getClass(obj) {
      if (typeof obj === "undefined")
        return "undefined";
      if (obj === null)
        return "null";
      return Object.prototype.toString.call(obj)
        .match(/^\[object\s(.*)\]$/)[1];
    }
    
        8
  •  1
  •   Firas Abd Alrahman    11 年前
    var data = 'json string ?';
    var jdata = null;
    try
    {
        jdata = $.parseJSON(data);  
    }catch(e)
    {}
    
    if(jdata)
    {
    //use jdata
    }else
    {
    //use data
    }
    
        9
  •  0
  •   Community miroxlav    7 年前

    如果要显式测试有效的JSON(而不是不返回值 false ),然后可以使用所述的解析方法 here .

        10
  •  0
  •   samvv    7 年前

    我真的不喜欢公认的答案。首先,它需要jQuery,而jQuery并不总是可用或必需的。第二,它对我认为是过度杀戮的物体做了一个完全的严格化。下面是一个简单的函数,它只使用 lodash 通用性库。

    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
    }
    

    我甚至花时间把它作为一个包放到npm中: https://npmjs.com/package/is-json-object . 和类似的东西一起使用 Webpack 在浏览器中获取。

    希望这能帮助别人!

        11
  •  0
  •   Abhishek Goel    6 年前

    我用这个来验证JSON对象

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

    我用这个来验证JSON字符串

    function isJsonString(str) {
        try {
            JSON.parse(str);
        } catch (e) {
            return false;
        }
        return true;
    }
    
        12
  •  -1
  •   skobaljic    9 年前

    您应该返回json 总是 ,但更改其 地位 ,或者在下面的示例中 响应代码 属性:

    if(callbackResults.ResponseCode!="200"){
        /* Some error, you can add a message too */
    } else {
        /* All fine, proceed with code */
    };