AJAX: проверить, является ли строка JSON?

73

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

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

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

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

  • 0
    Вы можете попробовать JSON.parse () в try / catch ... если вы можете перехватить, это недопустимая разметка JSON. Конечно, это неэффективно, хе ... Не могли бы вы привести пример неверной разметки JSON, которую вы получаете?
Теги:
validation

4 ответа

119

Если вы включите парсер

  • 9
    используя jQuery.parseJSON (..), вам не нужно будет включать json.org
  • 1
    @Raymo OP не упомянул об использовании jQuery и json2.js менее чем в два раза меньше jQuery (с точки зрения размера файла).
Показать ещё 3 комментария
19

Устанавливает альтернативу jQuery...

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

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

С помощью библиотеки JSON просто оберните вызов его эквивалентом parse() в try/catch-block для обработки не-JSON-входа:

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

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')) ; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню