Мой JavaScript иногда дает сбой в этой строке:
var json = eval('(' + this.responseText + ')');
Сбои возникают, когда аргумент eval()
не является JSON. Есть ли способ проверить, является ли строка JSON перед выполнением этого вызова?
Я не хочу использовать фреймворк - есть ли способ заставить эту работу работать, используя только eval()
? (Обещаю, на это есть веская причина.)
javascript
ajax
json
validation
Ник Хайнер
источник
источник
Ответы:
Если вы включите парсер JSON с json.org, вы можете использовать его функцию parse () и просто обернуть ее в try / catch, например:
try { var json = JSON.parse(this.responseText); } catch(e) { alert('invalid json'); }
Что-то подобное, вероятно, сделает то, что вы хотите.
источник
Ее альтернатива jQuery ...
try { var jsonObject = jQuery.parseJSON(yourJsonString); } catch(e) { // handle error }
источник
Я настоятельно рекомендую вам использовать библиотеку javascript JSON для сериализации в JSON и обратно.
eval()
представляет собой угрозу безопасности, которую никогда не следует использовать, если вы не уверены, что входные данные дезинфицированы и безопасны.Имея библиотеку JSON, просто оберните вызов в его
parse()
эквивалент в блоке try / catch для обработки ввода, отличного от JSON:try { var jsonObject = JSON.parse(yourJsonString); } catch(e) { // handle error }
источник
Возможно, это поможет: с помощью этого кода вы можете напрямую получать свои данные ...
<!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>
источник
Проблема с зависимостью от
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' }
источник
Почему нельзя просто проверить, какой ответ? Это более эффективно.
var result; if (response.headers['Content-Type'] === 'application/json') result = JSON.parse(this.responseText); else result = this.responseText;
экран1
источник
Есть крошечная библиотека, которая проверяет типы 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
источник