Это хороший способ синтаксического анализа JSON? - PullRequest
1 голос
/ 29 июня 2011

Я смотрю на другой код разработчика, который анализирует JSON. Я не могу понять, как это работает или если это хорошая идея ...

hmlPlaylist.prototype.loadVideos_callback = function (data) {
    var jsonData = '';
    var jsonError = false;

    try {
        jsonData = eval("(" + data + ")");
    } catch (jError) {
        jsonError = true;
    }

    if (!jsonError) {

        if (jsonData.playlists.length > 0) {
            this.buildPlaylistList(jsonData.playlists);
        }
        if (jsonData.videos.length > 0) {
            this.buildVideoList(jsonData.videos);
            this.bindVideoNavs();
        }
    }
    else {

        // no json returned, don't do anything
    }
};

Это линия

jsonData = eval("(" + data + ")");

Это меня достает. Что это делает с данными? Я думал, что вам нужно использовать библиотеку внешних классов для анализа данных JSON?

Позже я вижу, что он повторяет коллекцию следующим образом:

for (var i = 0; i < playlistCount; i++) {

        var p = playlists[i];

Так это действительно хороший способ пройти через JSON?

Ответы [ 5 ]

1 голос
/ 29 июня 2011

eval просто запускает любую строку, переданную ему, как если бы это был код. Если вы предоставляете JSON как строку, она оценивает строку как код, который затем создает объект JSON. eval является допустимым для анализа JSON, хотя аргумент для этого стал значительно слабее в наши дни, поскольку существуют лучшие методы (JSON.parse, jQuery $.ajax с "json" datatype или $.getJSON).

Для примера аргумента eval принимает и что он производит:

var a = {foo: [0, 1], bar: {baz: 2}};
var b = JSON.stringify(a);
alert(b);                    // alerts '{"foo":[0,1],"bar":{"baz":2}}'
var c = eval("(" + b + ")");
alert(c.foo);                // alerts '0,1'
alert(c.bar.baz);            // alerts '2'

Что касается безопасности eval, поскольку он может принимать только правильно сформированный JSON с вашего сервера, который не подлежит вводу пользователем, риски довольно минимальны. Риск, FWIW, заключается в том, что некоторые пользователи предоставляют код JS в виде строки, которая внедряет скрипт, который затем можно использовать для сбора конфиденциальной информации о других пользователях, посещающих страницу. JSON.parse - если вы потом не будете eval его часть - не имели бы этого риска.

1 голос
/ 29 июня 2011

JSON - это код java-скрипта.

jsonData = eval("(" + data + ")");

Функция eval() выполняет код java-скрипта и возвращает результат (объект).Вы можете найти некоторую информацию о eval здесь .

Проблема в том, что функция eval также может выполнять обычный код сценария Java, это небезопасно.Вместо этого используйте JSON.parse(data).

1 голос
/ 29 июня 2011

Не делай этого.Сделайте это: https://github.com/douglascrockford/JSON-js

Один из лучших рекомендуемых парсеров JSON для Javascript.

1 голос
/ 29 июня 2011

Большинство современных браузеров поддерживают собственный метод JSON.parse, который делает именно это.Если вы нацеливаетесь на браузер, который этого не делает, вы можете использовать реализацию Дугласа Крокфорда, предоставленную здесь (прокрутите вниз).

В любом случае, не используйте eval, если можетевообще избегать этого.

Обновление (относительно eval):

As JSON.org состояния:

JSON - это подмножество объектной литеральной нотации JavaScript.Поскольку JSON является подмножеством JavaScript, его можно использовать на языке без суеты и суеты.

Что это означает на практике?Ну, это означает, что любой допустимый объект JSON также является допустимым кодом JS (в техническом плане: это допустимое выражение JS, которое оценивается как литерал объекта).Следовательно, вы можете вставить JSON в файл и указать, например, вашему браузеру загрузить его как JavaScript, и он сделает это без каких-либо ошибок или предупреждений (конечно, «JavaScript» на самом деле не будет делать ничего, потому что этотолько представление объекта, а не процедурный код).

Поскольку мы установили, что JSON можно интерпретировать как JavaScript, его также можно передать в eval.Давайте посмотрим, что MDC может сказать о eval:

Аргументом функции eval является строка.Если строка представляет выражение, eval оценивает выражение.

...

Анализ JSON (преобразование строк в объекты JavaScript)

ЕслиСтрока, к которой вы вызываете eval(), содержит данные (например, массив: "[1, 2, 3]"), в отличие от кода, вам следует подумать о переключении на JSON, что позволяет строке использовать поднабор синтаксиса JavaScript для представления данных.

Приведенное выше, возможно, не лучшее объяснение, но оно говорит о том, что происходит: JSON можно рассматривать как выражение JS.eval принимает строку, представляющую выражение JS (в данном случае строку, содержащую JSON), оценивает ее и возвращает результат.Это как мини-компилятор, к которому вы можете передать код во время выполнения, и он запустит код для вас и вернет результат.В этом случае результатом будет объект JS (как уже упоминалось, JSON является допустимым выражением JS, представляющим объект).

Так что если у вас есть

var json = '{"foo": "bar", "answer": 42}';
var object1 = eval(json);

var object2 = { foo: "bar", answer: 42 };

Тогда object1 и object2 будут двумя разными, но идентичными объектами.

1 голос
/ 29 июня 2011

JSON.parse(stringOfJson) - лучший способ разбора json. Если вы используете jquery, вы можете сообщить $.ajax, что вы ожидаете возвращения json, и он проанализирует его для вас с помощью опции конфигурации dataType: 'json'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...