Я заметил, что jQuery parseJSON в основном делает простой regex "проверка":
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
} else {
jQuery.error( "Invalid JSON: " + data );
}
},
Если это проходит ту "проверку" и если это - современный браузер используется, собственный синтаксический анализатор JSON. Иначе я принимаю для браузера как IE6, новая функция автоматически вызывается и возвращает объект.
Вопрос № 1: Так как это - просто простой тест regex, разве это не подвержено своего рода неясному использованию пограничного случая? Мы не должны действительно использовать полноценный синтаксический анализатор для браузеров, которые не поддерживают собственный JSON, анализирующий, по крайней мере?
Вопрос № 2: Насколько "более безопасный" (new Function(" return " + data ))()
в противоположность eval("(" + text + ")")
?
Метод JSON.parse
является самым безопасным. Это определяется, когда вы включаете json2.js
из http://www.json.org/js.html , и автоматически используется parseJSON / getJSON. Он анализирует, а не выполняет разметку JSON.