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


101

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


2
如果它实际上是“您的”服务器端代码,那么为什么不在JSON结果中包含状态字段,而不是创建这种“有时是JSON,有时是不是”的情况呢?
HostileFork说不要相信

@Hostile出于调试原因。您现在再也不会出现服务器将发生哪种故障,并且此时不使用json。
巴特

1
我仍然看不到服务器响应中包含错误代码(作为命名字段)将如何破坏它。对于Freebase来说已经足够好了! wiki.freebase.com/wiki/MQL_errors
HostileFork说不要相信2010年

如果可以,则将接受的答案更改为Serguei Federov的答案,如果当前接受的答案不正确。
Serj Sagan

什么是“ json对象”?有JSON字符串和JS对象,但没有“ JavaScript对象符号对象”之类的东西。
mpen

Answers:


105

如果字符串是JSON,则jQuery.parseJSON()应该返回类型为“对象”的对象,因此您只需使用以下命令检查类型 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
  }
}

29
如果parseJSON可能处理的不是JSON值(例如HTML),则还可能需要使用try / catch进行异常处理
acorncom 2012年

2
在jQuery 1.9之前,$ .parseJSON返回null,而不是如果传递了空字符串,null或undefined则抛出错误,即使它们不是有效的JSON。jQuery网站链接
gloomy.penguin 2013年

7
这个解决方案不是最好的,因为返回"SyntaxError: JSON.parse: unexpected character"错误!,我认为最好的解决办法是使用try / catch语句,通过说Serguei Fedorov在这里:stackoverflow.com/questions/4295386/...
彩蝶KAZ

2
:如果你不想使用jQuery,您可以通过检查构造类型,这里介绍用香草JS stackoverflow.com/questions/11182924/...

2
该答案不正确,Serguei Federov的答案应为公认的答案。
Serj Sagan

148

所选的解决方案实际上不适用于我,因为我得到了

     "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还是对象
Dr.Molle

2
性能考虑:将其包装在函数中,确保不对json进行两次解析(一次在try catch中,一次在调用该函数的代码中。)
Michiel Cornille 2015年

这是一个助手的作用isJSON() ,您可以使用:isJSON(someValue)
Chofoteddy

19

解决方案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都会为您验证它并通过其函数“ 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) {}
});

13

如果您有jQuery,请使用isPlainObject

if ($.isPlainObject(my_var)) {}

5
如果在字符串上使用isPlainObject,则返回false,例如jQuery.isPlainObject('{}')
Roy Shoa

更重要的是,如果它包含非JSON值作为属性,根据文档,此函数仍将返回true
samvv

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

4

由于它只是false和json对象,所以为什么不检查它是否为false,否则它必须是json。

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

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

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

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

0

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


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等一起使用,可以在浏览器中获取它。

希望这对某人有帮助!


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

0

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

jQuery.isEmptyObject()

helps头可以帮助别人解决这个问题


-1

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

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

@bart,您只需在if条件中提供对象,即可进行检查。
神户
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.