AJAX: Проверьте, является ли строка JSON?
Мой JavaScript иногда сбой в этой строке:
var json = eval('(' + this.responseText + ')');
Сбои возникают, когда аргумент eval()
не является JSON. Есть ли способ проверить, является ли строка JSON перед выполнением этого вызова?
Я не хочу использовать фреймворк - есть ли способ сделать эту работу, используя только eval()
? (Там хорошая причина, я обещаю.)
Ответы
Ответ 2
Устанавливает альтернативу jQuery...
try
{
var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
// handle error
}
Ответ 3
Я настоятельно рекомендую вам использовать javascript JSON library для сериализации в JSON и из него. eval()
- это риск безопасности, который никогда не должен использоваться, если вы абсолютно не уверены в том, что его ввод в санацию и безопасность.
С помощью библиотеки JSON просто оберните вызов его эквивалентом parse()
в try/catch-block для обработки не-JSON-входа:
try
{
var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
// handle error
}
Ответ 4
Promise
вместо Try-catch
:
npm install is-json-promise ; //for NodeJS environment.
ИЛИ
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')) ;
Ответ 5
Может быть, это поможет: С помощью этого кода вы можете получить свои данные напрямую...
<!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>
Ответ 6
Проблема с зависимостью от подхода 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'
}
Ответ 7
Ниже приведена функция, которую вы можете попробовать:
String.prototype.isJson = function () {
try {
JSON.parse(this.toString());
return true;
} catch (ex) {
return false;
}
};
Ответ 8
Существует небольшая библиотека, которая проверяет типы 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
Ответ 9
Почему вы не можете просто проверить, каков ответ? Это более эффективно.
var result;
if (response.headers['Content-Type'] === 'application/json')
result = JSON.parse(this.responseText);
else
result = this.responseText;