私のJavaScriptは時々この行でクラッシュします:
var json = eval('(' + this.responseText + ')');
の引数がeval()
JSONでない場合、クラッシュが発生します。この呼び出しを行う前に、文字列がJSONであるかどうかを確認する方法はありますか?
フレームワークを使いたくないのですが、これを使ってこれを機能させる方法はありますeval()
か?(正当な理由があります、私は約束します。)
私のJavaScriptは時々この行でクラッシュします:
var json = eval('(' + this.responseText + ')');
の引数がeval()
JSONでない場合、クラッシュが発生します。この呼び出しを行う前に、文字列がJSONであるかどうかを確認する方法はありますか?
フレームワークを使いたくないのですが、これを使ってこれを機能させる方法はありますeval()
か?(正当な理由があります、私は約束します。)
回答:
json.orgのJSONパーサーを含める場合は、そのparse()関数を使用して、次のようにtry / catchでラップすることができます。
try
{
var json = JSON.parse(this.responseText);
}
catch(e)
{
alert('invalid json');
}
そのような何かはおそらくあなたが望むことをするでしょう。
彼女はjQueryの代替手段です...
try
{
var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
// handle error
}
JSONとの間でシリアル化するには、JavaScriptJSONライブラリを使用することを強くお勧めします。eval()
はセキュリティリスクであり、入力がサニタイズされて安全であることが絶対に確実でない限り、決して使用しないでください。
JSONライブラリを配置したら、parse()
同等の呼び出しをtry / catch-blockでラップして、JSON以外の入力を処理します。
try
{
var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
// handle error
}
たぶんこれは役に立ちます:このコードを使用すると、データを直接取得できます…
<!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>
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