AJAX:文字列がJSONかどうかを確認しますか?


83

私のJavaScriptは時々この行でクラッシュします:

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

の引数がeval()JSONでない場合、クラッシュが発生します。この呼び出しを行う前に、文字列がJSONであるかどうかを確認する方法はありますか?

フレームワークを使いたくないのですが、これを使ってこれを機能させる方法はありますeval()か?(正当な理由があります、私は約束します。)


try / catchでJSON.parse()を試みることができます...キャッチできる場合は、無効なJSONマークアップです。もちろん、それはちょっと非効率的ですよね...取得している無効なJSONマークアップの例を教えてください。
いぼ2010

回答:


157

json.orgのJSONパーサーを含める場合は、そのparse()関数を使用して、次のようにtry / catchでラップすることができます。

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

そのような何かはおそらくあなたが望むことをするでしょう。


9
jQuery.parseJSON(..)を使用すると、json.orgを含める必要はありません
RayLoveless 2012

1
@Raymo OPは、jQueryとjson2.jsをjQueryの半分以下のサイズ(ファイルサイズに関して)で使用することについては言及していません。
brettkelly 2012

文字列全体を解析することは悪い習慣であり、例外をスローするとラグが発生する可能性があります
2016年

数値文字列を送信しても例外はスローされません
Hesham Yassin 2018

21

彼女はjQueryの代替手段です...

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

15

JSONとの間でシリアル化するには、JavaScriptJSONライブラリを使用することを強くお勧めします。eval()はセキュリティリスクであり、入力がサニタイズされて安全であることが絶対に確実でない限り、決して使用しないでください。

JSONライブラリを配置したら、parse()同等の呼び出しをtry / catch-blockでラップして、JSON以外の入力を処理します。

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

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>


同じ結果を達成するための代替方法はたくさんありますが、eval()を使用するのはおそらく最も適切ではありません。
デビッド

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

0

応答が何であるかを確認できないのはなぜですか?それはより効率的です。

var result;

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

screen1


-1

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.