【问题标题】:How can I check if a value is a JSON object?如何检查值是否为 JSON 对象?
【发布时间】:2011-05-16 18:34:36
【问题描述】:

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

【问题讨论】:

  • 如果它实际上是“你的”服务器端代码,为什么不在 JSON 结果中有一个状态字段,而不是创建这种“有时是 JSON 有时不是”的情况。 .?
  • @Hostile 出于调试原因。您现在永远不会知道服务器会抛出哪种故障,而此时 json 没有被使用。
  • 我仍然看不出服务器响应中的错误代码(作为命名字段)会如何破坏这一点。对 Freebase 来说已经足够了! wiki.freebase.com/wiki/MQL_errors
  • 如果当前接受的答案不正确,请将接受的答案更改为 Serguei Federov 的答案。
  • 什么是“json 对象”?有 JSON 字符串和 JS 对象,但没有“JavaScript Object Notation object”之类的东西。

标签: jquery json object


【解决方案1】:

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 请求返回字符串类型的内容或返回混合类型,这就是解决方案。

【讨论】:

  • 问题不在于非 JSON 字符串。服务器返回总是一个有效的 JSON(字符串 false 也是有效的 JSON)。问题只有一点:如何区分解析的 JSON 字符串是布尔值false 还是对象
  • 性能考虑:将其包装在一个函数中,确保不解析 json 两次(一次在 try catch 中,一次在调用函数的代码中。)
  • 这是一个辅助函数isJSON(),您可以使用:isJSON(someValue)
【解决方案2】:

jQuery.parseJSON() 应该返回一个“object”类型的对象,如果字符串是 JSON,那么你只需要使用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
  }
}

【讨论】:

  • 如果 parseJSON 可能会处理 JSON 值以外的其他内容(即 HTML),则可能还需要使用 try / catch 处理异常
  • 在 jQuery 1.9 之前,如果 $.parseJSON 传递一个空字符串、null 或 undefined,则返回 null 而不是抛出错误,即使这些不是有效的 JSON。 jquery site link
  • 这个解决方案不是最好的,因为返回"SyntaxError: JSON.parse: unexpected character"错误! ,我认为最好的解决方案是使用 Serguei Fedorov 在这里所说的 try/catch:stackoverflow.com/questions/4295386/…
  • 如果您不想使用 jquery,可以通过检查构造函数类型来使用 vanilla JS,如下所述:stackoverflow.com/questions/11182924/…
  • 这个答案不正确,Serguei Federov 的答案应该是公认的答案。
【解决方案3】:

解决方案 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 或数组类型的最佳方法如下:

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 带来信息。我建议您将“json”值放入“dataType”属性中,这样无论您是否获得 JSON,JQuery 都会为您验证它并通过它们的“成功”和“错误”函数使其知道。示例:

$.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】:

    如果您有 jQuery,请使用 isPlainObject

    if ($.isPlainObject(my_var)) {}
    

    【讨论】:

    • 如果你在一个字符串上使用 isPlainObject 它返回 false,例如jQuery.isPlainObject('{}')
    • 更重要的是,如果它包含一个非 JSON 类值作为属性,根据文档,此函数仍将返回 true
    【解决方案5】:
    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】:

      既然只是false和json对象,为什么不检查是否为false,否则一定是json。

      if(ret == false || ret == "false") {
          // json
      }
      

      【讨论】:

        【解决方案7】:

        我知道这个帖子已经回答了,但是来到这里并没有真正解决我的问题,我在其他地方找到了这个功能。 也许有人来这里会发现它对他们有一些用处;

        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】:
          var data = 'json string ?';
          var jdata = null;
          try
          {
              jdata = $.parseJSON(data);  
          }catch(e)
          {}
          
          if(jdata)
          {
          //use jdata
          }else
          {
          //use data
          }
          

          【讨论】:

            【解决方案9】:

            如果您想显式测试有效的 JSON(而不是缺少返回值 false),那么您可以使用 here 中描述的解析方法。

            【讨论】:

              【解决方案10】:

              我不太喜欢接受的答案。首先,它需要 jQuery,但它并不总是可用或必需的。其次,它对对象进行了完整的字符串化,这对我来说太过分了。这是一个简单的函数,它可以彻底检测一个值是否类似于 JSON,只使用 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】:

                我正在使用它来验证 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】:

                  我尝试了所有建议的答案,对我没有任何效果,所以我不得不使用

                  jQuery.isEmptyObject()
                  

                  帮助别人解决这个问题的锄头

                  【讨论】:

                    【解决方案13】:

                    您应该始终返回 json,但要更改其 状态,或者在以下示例中更改 ResponseCode 属性:

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

                    【讨论】:

                    • @bart ,你可以只提供 if 条件中的对象,它会做检查。
                    猜你喜欢
                    • 2012-06-26
                    • 2015-04-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-26
                    • 2023-03-15
                    相关资源
                    最近更新 更多