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

时间:2010-11-28 04:34:06

标签: jquery json object

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

13 个答案:

答案 0 :(得分:141)

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请求返回字符串类型的东西,或者如果您要返回混合类型,那么这就是解决方案。

答案 1 :(得分:98)

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
  }
}

答案 2 :(得分:16)

解决方案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提供信息。我建议你在“dataType”属性中加入“json”值,这样如果你得到一个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) {}
});

答案 3 :(得分:13)

如果你有jQuery,请使用isPlainObject

if ($.isPlainObject(my_var)) {}

答案 4 :(得分:6)

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

答案 5 :(得分:4)

因为它只是假和json对象,为什么不检查它是否为假,否则它必须是json。

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

答案 6 :(得分:2)

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

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}

答案 7 :(得分:1)

var data = 'json string ?';
var jdata = null;
try
{
    jdata = $.parseJSON(data);  
}catch(e)
{}

if(jdata)
{
//use jdata
}else
{
//use data
}

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我不太喜欢接受的答案。首先,它需要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之类的内容一起使用即可在浏览器中使用它。

希望这有助于某人!

答案 10 :(得分:0)

我用它来验证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;
}

答案 11 :(得分:0)

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

jQuery.isEmptyObject()

hoe头可以帮助其他人解决此问题

答案 12 :(得分:-1)

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

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