1

この関数を使用して、JSONオブジェクトの有効性をテストしています。

function is_JSON( test ) {
    try { var c = $.parseJSON( test );
    } catch (e) { return false; }
    return true;
}

ここでは、jQuery1.8.3でうまく機能していることがわかります...

http://jsfiddle.net/xZYVY/

...しかし、jQuery 1.9.1に切り替えると、これは機能しません。

http://jsfiddle.net/xZYVY/1/

私は何が欠けていますか?有効なJSONをテストするためのより良い方法はありますか?

4

3 に答える 3

3

コードのこの部分:

var test = ['thing1','thing2','thing3'];

有効なJSON式を含む文字列の代わりに配列を作成します。1.8.3で動作するように見えた理由は、当時は次parseJSONのようになっていたためです。

function( data ) {
if ( !data || typeof data !== "string") {
        return null;
    }
    // ...
}

ご覧のとおり、最初の引数として配列を渡すと、null;が返されます。例外はスローされません。

次に、関数は次を返しますtrue

parseJSON: function is_JSON( test ) {
    try { var c = $.parseJSON( test );
    } catch (e) { return false; }
    // c === null
    return true;
}

1.9以降、parseJSON次のようになります。

parseJSON: function( data ) {
    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    if ( data === null ) {
        return data;
    }
    if ( data === null ) {
        return data;
    }
    // etc.

window.JSON.parse()渡されたパラメーターが有効なJSON式でない場合は、例外がスローされます。

有効な式は次のとおりです。

'["thing1","thing2","thing3"]'

テストする:

> JSON.parse('["thing1","thing2","thing3"]')
["thing1", "thing2", "thing3"]
于 2013-02-26T15:56:47.117 に答える
1

「テスト」変数は、単に有効なJSON文字列ではありません。これはJavaScript配列です。

これは、値がJSON文字列である修正バージョンです。

 var test = '["thing1","thing2","thing3"]';

さて、1.8.3がそのように機能しないのは興味深いことです、私は認めます。研究の時間..。

OK、1.9より前では、コードは文字列以外の引数値$.parseJSON()をすばやく返していました。nullこれで、使用可能な場合はネイティブにすぐに延期され、JSON.parse()文字列以外、null以外の引数でエラーがスローされるため、例外が発生します。

于 2013-02-26T15:51:58.347 に答える
1

私はそれがあなたの言うことの反対だと思います:jQuery / 1.8では、無効なJSON文字列が$.parseJSON()returnを返すため、期待どおりに機能していませんでしたnull。ただし、jQuery/1.9では例外がスローされます。

APIドキュメントによると:

不正な形式のJSON文字列を渡すと、例外がスローされる可能性があります

したがって、その動作に依存することはできません。戻り値もテストする必要があります。

于 2013-02-26T15:58:12.323 に答える