Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чем распарсить JSON 
:(
    Опции темы
dix75
Дата 15.3.2012, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



Доброй ночи!

Есть JSON такого вида.
Код

{result:"hello", result2: "wwww" }


Как сие чудо превратить в объект.
jQuery.parseJSON  не работает
JSON.parse              не работает
eval                             зло

Как быть.
Изменить формат получаемого JSON невозможно.


--------------------
save your mind
PM MAIL   Вверх
ksnk
Дата 15.3.2012, 21:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(dix75 @  15.3.2012,  21:12 Найти цитируемый пост)
eval                             зло

В чем зло?

Код

return (new Function( "return " + data ))(); 


Добавлено через 21 секунду
Чем мой пример добрее eval'а ?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
dix75
Дата 16.3.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



ksnk, 
Добрее тем, что у тебя область ограничена функцией, в отличие от eval, где область не ограничена функцией.

Function, setInterval, setTimeout в данном случаи работаю одинаково.

Я не хочу их использовать.


--------------------
save your mind
PM MAIL   Вверх
skyboy
Дата 16.3.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Код

JSON.parse('{"f": 54}')


Добавлено через 2 минуты и 8 секунд
про нативную поддержку парсинга JSON'а
PM MAIL   Вверх
ksnk
Дата 16.3.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(skyboy @  16.3.2012,  16:23 Найти цитируемый пост)
JSON.parse('{"f": 54}')

Цитата(dix75 @  15.3.2012,  21:12 Найти цитируемый пост)
JSON.parse              не работает

?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 16.3.2012, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



ksnk, угу. невнимательность.
хотя, возникает вопрос: может, что-то не то со структурой данных?
учитывая код jQuery.parseJSON:
Код

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

        // Attempt to parse using the native JSON parser first
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }

        // Make sure the incoming data is actual JSON
        // Logic borrowed from http://json.org/json2.js
        if ( rvalidchars.test( data.replace( rvalidescape, "@" )
            .replace( rvalidtokens, "]" )
            .replace( rvalidbraces, "")) ) {

            return ( new Function( "return " + data ) )();

        }
        jQuery.error( "Invalid JSON: " + data );
    },

    не вижу причины, почему "new Function"-метод работает, а JSON.parse — нет. Разве что, ключи объекта без кавычек…
PM MAIL   Вверх
ksnk
Дата 16.3.2012, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(dix75 @  16.3.2012,  11:06 Найти цитируемый пост)
Добрее тем, что у тебя область ограничена функцией, в отличие от eval, где область не ограничена функцией.

Не! Давай точно определим доброту. 

Если злой умышленник отправит в ответ на запрос что-то вроде 
Код

(document.location="xxx", true)
, то сайт уже никто не спасет. Только JSON.parse мог бы.
Если кодер написал свои собственные функции и переменные - то они элегантно закрылись в функции и наружу уже не видны.
А если именно это и нужно было? (хотя такое поведение и некрасиво..., но динамическая подгрузка нужных фенечек бывает полезна)
Если в переменной нормальное изображение объекта, то сработают оба варианта (eval и function) без разницы.

От какого зла защищаемся?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
502
Дата 16.3.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: 1
Всего: 4



Цитата(ksnk @  16.3.2012,  16:37 Найти цитируемый пост)
? 

у ТС возможно не работало потому что данные у него не JSON
PM MAIL   Вверх
ksnk
Дата 16.3.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(skyboy @  16.3.2012,  16:46 Найти цитируемый пост)
не вижу причины, почему "new Function"-метод работает, а JSON.parse — нет

Цитата(skyboy @  16.3.2012,  16:46 Найти цитируемый пост)
Разве что, ключи объекта без кавычек

Был какой-то период, когда json_encode не мог кодировать большие объемы данных и приходилось пользоваться фунцией php2js  из Котеровских библиотек. eval или function от них давал вполне работоспособный объект без ошибок, а функция от jQuery - ломалась и ругалась. 

До меня только сейчас дошло почему мне пришлось переписывать json-логику  smile 

P.S. Не. дело было не в этом . Ключи функцией возвращались строковыми...

Это сообщение отредактировал(а) ksnk - 16.3.2012, 17:12


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 16.3.2012, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(ksnk @  16.3.2012,  16:10 Найти цитируемый пост)
когда json_encode не мог кодировать большие объемы данных

как давно это было?
пытался запустить php2js онлайн, чтоб посмотреть, какой там вывод, но не вышло smile так что не имею предположений, почему это оно не работало.
единственное соображение: если падал jQuery.parseJSON, но работало new Function, значит, ошибка была при запуске JSON.parse и, вероятней всего, дело в отсутствие кавычек в ожидаемых функцией местах
PM MAIL   Вверх
dix75
Дата 16.3.2012, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



Цитата(ksnk @  16.3.2012,  16:48 Найти цитируемый пост)
, то сайт уже никто не спасет. Только JSON.parse мог бы.

Я и не говорил, что Function защита от всего


--------------------
save your mind
PM MAIL   Вверх
ksnk
Дата 16.3.2012, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(skyboy @  16.3.2012,  19:41 Найти цитируемый пост)
как давно это было?

php 4, если ничего не путаю.
Цитата

пытался запустить php2js онлайн,

php2js (который у меня работал) использует одинарные кавычки. А jQuery желает только двойные. вот и причина.
Ну да ладно, заодно я тогда  решил проблему обработки таймаута в запросе, выдачи отладочного и ошибочного (когда валится сообщение об ошибке. а не json) ответа, так что все равно получилось удачно ;)

Цитата(dix75 @  16.3.2012,  22:11 Найти цитируемый пост)
Я и не говорил, что Function защита от всего 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 20.3.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(ksnk @  16.3.2012,  22:47 Найти цитируемый пост)
А jQuery желает только двойные. вот и причина.

ну, я ж привел кусок кода  smile 
jQuery только предоставляет фасад либо к JSON.parse, либо через new Function. 
кстати, да, JSON.parse в Firefox 11 ругается на {'a': 4}
с другой стороны, php2js вполне себе принимает аргументом кавычку.
а json_encode — нет, зато позволяет по-хитрому обрабатывать объекты, реализующие JsonSerializable
и да, я понимаю, что для тебя это не актуально уже smile
но, вдруг, кто-то будет в этой теме копаться и пригодится…
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1128 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.