web-dev-qa-db-ja.com

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

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

_var json = eval('(' + this.responseText + ')');
_

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

フレームワークを使用したくない-eval()だけを使用してこの作業を行う方法はありますか? (正当な理由があると約束します。)

82
Nick Heiner

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

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

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

152
inkedmn

彼女のjQueryの代替...

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

JSONとのシリアル化には javascript JSON library を使用することを強くお勧めします。 eval()はセキュリティリスクであり、入力がサニタイズされ安全であることを絶対的に確信している場合を除き、決して使用すべきではありません。

JSONライブラリを適切に配置し、そのparse()相当の呼び出しをtry/catch-blockでラップして、非JSON入力を処理します。

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}
14
Håvard S

Try-catchの代わりにPromise

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')) ; 
8
Abdennour TOUMI

たぶんこれが役立つ:このコードを使えば、あなたのデータを直接取得することができます...

<!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>
2

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

var result;

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

screen1

0
ADM-IT

以下は関数です、あなたは試すことができます:

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

_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
Hesham Yassin

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


0
Ramazan Polat