AJAX:检查字符串是否是JSON?

时间:2010-02-22 19:46:21

标签: javascript ajax json validation

我的JavaScript有时会在此行崩溃:

var json = eval('(' + this.responseText + ')');

eval()的参数不是JSON时会导致崩溃。在进行此调用之前,有没有办法检查字符串是否为JSON?

我不想使用框架 - 有没有办法只使用eval()来完成这项工作? (我保证,这是一个很好的理由。)

9 个答案:

答案 0 :(得分:148)

如果你在json.org中包含JSON parser,你可以使用它的parse()函数并将其包装在try / catch中,如下所示:

try
{
   var json = JSON.parse(this.responseText);
}
catch(e)
{
   alert('invalid json');
}

这样的事可能会做你想做的事。

答案 1 :(得分:21)

她是jQuery的替代品......

try
{
  var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
  // handle error 
}

答案 2 :(得分:14)

我强烈建议您使用javascript JSON library与JSON进行序列化。 eval()是一种安全风险,除非您绝对确定其输入已经过消毒且安全,否则不应使用此安全风险。

使用JSON库,只需将调用包装到try / catch-block中的parse()等效项来处理非JSON输入:

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}

答案 3 :(得分:7)

Promise代替Try-catch

npm install is-json-promise ; //for NodeJS environment.

OR

String.IsJSON = (candidate) => 
   new Promise(
     (resolve, reject) => resolve(JSON.parse(candidate))
    ) 
;

用例:

String.IsJSON(`iam here`)
   .then((object) => console.info(object))
   .catch((error) => alert('Waww, i cannot be JSON')) ; // promise will run catch

String.IsJSON(`{"welcome":"Hello"}`)
   .then((object) => console.info(object)) // promise will run "then"
   .catch((error) => alert('Waww, i cannot be JSON')) ; 

答案 4 :(得分:2)

也许这可以帮助: 使用此代码,您可以直接获取您的数据…

<!DOCTYPE html>
<html>
<body>

<h3>Open console, please, to view result!</h3>
<p id="demo"></p>

<script>
var tryJSON = function (test) {
	try {
	    JSON.parse(test);
	}
	catch(err) {
    	// maybe you need to escape this… (or not)
	    test = '"'+test.replace(/\\?"/g,'\\"')+'"';
	}
	eval('test = '+test);
	console.debug('Try json:', test);
};

// test with string…
var test = 'bonjour "mister"';
tryJSON(test);
// test with JSON…
var test = '{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}';
tryJSON(test);
</script>

</body>
</html>

答案 5 :(得分:0)

取决于try-catch方法的问题是JSON.parse('123') = 123并且不会引发异常。因此,除了try-catch之外,我们还需要检查以下类型:

function isJsonStr(str) {
    var parsedStr = str;
    try {
        parsedStr = JSON.parse(str);
    } catch (e) {
        return false;
    }
    return typeof parsedStr == 'object'
}

答案 6 :(得分:0)

下面是一个函数,您可以尝试:

String.prototype.isJson = function () {
  try {
      JSON.parse(this.toString());
      return true;
  } catch (ex) {
      return false;
  }
};

答案 7 :(得分:0)

有一个微型库可以检查JavaScript类型:is.js

is.json({foo: 'bar'});
=> true

// functions are returning as false
is.json(toString);
=> false

is.not.json([]);
=> true

is.all.json({}, 1);
=> false

is.any.json({}, 2);
=> true

// 'all' and 'any' interfaces can also take array parameter
is.all.json([{}, {foo: 'bar'}]);
=> true

实际上is.js远不止于此,一些值得一提的是:

var obj = document.createElement('div');
is.domNode(obj);
=> true

is.error(new Error());
=> true

is.function(toString);
=> true

is.chrome();
=> true if current browser is chrome


答案 8 :(得分:0)

为什么不能仅检查响应是什么?效率更高。

var result;

if (response.headers['Content-Type'] === 'application/json')
    result = JSON.parse(this.responseText);
else
    result = this.responseText;

screen1