AJAX: проверить, является ли строка JSON? - PullRequest
79 голосов
/ 22 февраля 2010

Мой JavaScript иногда падает на этой строке:

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

Сбои возникают, когда аргумент eval() не является JSON. Есть ли способ проверить, является ли строка JSON перед выполнением этого вызова?

Я не хочу использовать фреймворк - есть ли способ заставить эту работу использовать только eval()? (Есть веская причина, я обещаю.)

Ответы [ 8 ]

148 голосов
/ 22 февраля 2010

Если вы включите JSON-парсер из json.org, вы можете использовать его функцию parse () и просто обернуть его в try / catch, например:

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

Что-то подобное, вероятно, будет делать то, что вы хотите.

21 голосов
/ 27 декабря 2012

Её альтернатива jQuery ...

try
{
  var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
  // handle error 
}
14 голосов
/ 22 февраля 2010

Я настоятельно рекомендую вам использовать javascript библиотеку JSON для сериализации в и из JSON. eval() - это риск для безопасности, который никогда не должен использоваться, если вы не абсолютно уверены , что его вход очищен и безопасен.

Имея библиотеку JSON, просто оберните вызов в parse() эквивалент в блоке try / catch для обработки ввода не-JSON:

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}
7 голосов
/ 21 ноября 2016

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')) ; 
2 голосов
/ 24 октября 2018

Может быть, это поможет: С помощью этого кода вы можете получить ваши данные напрямую ...

<!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>
0 голосов
/ 23 февраля 2019

Существует небольшая библиотека, которая проверяет типы 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 голосов
/ 28 сентября 2018

Ниже приведена функция, вы можете попробовать:

String.prototype.isJson = function () {
  try {
      JSON.parse(this.toString());
      return true;
  } catch (ex) {
      return false;
  }
};
0 голосов
/ 30 июля 2018

Проблема в зависимости от подхода 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'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...