Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: JSON и рандомный вывод ключа/значения  (Прочитано 337 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий

ru
Offline Offline

« : 02-02-2019 03:47 » 

Приветствую. Нет ли возможности сделать вывод json-данных по дефолту, т.е., чтобы данные выводились так же, как в хэше, а не рандомно. В самом модуле вот, что говорится об этом:
Цитата
If $enable is false, then the encode method will output key-value pairs in the order Perl stores them (which will likely change between runs of the same script, and can change even within the same run from 5.18 onwards).
Тут говорится, что можно только отсортировать по алфавиту ключи через параметр canonical, в противном случае, данные выводятся РАНДОМНО.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 02-02-2019 13:22 » 

perldoc JSON::XS

_
    $json = $json->canonical ([$enable])
    $enabled = $json->get_canonical
        If $enable is true (or missing), then the "encode" method will output
        JSON objects by sorting their keys. This is adding a comparatively
        high overhead.

        If $enable is false, then the "encode" method will output key-value
        pairs in the order Perl stores them (which will likely change between
        runs of the same script, and can change even within the same run from
        5.18 onwards).

        This option is useful if you want the same data structure to be
        encoded as the same JSON text (given the same overall settings). If it
        is disabled, the same hash might be encoded differently even if
        contains the same data, as key-value pairs have no inherent ordering
        in Perl.

        This setting has no effect when decoding JSON texts.

        This setting has currently no effect on tied hashes.

Рекомендую использовать для JSON именно этот модуль.

Код: (Perl)
use JSON::XS ();
my $json = JSON::XS->new->canonical;
my $str = $json->encode($hashref);

При вводе выводе обрати внимание на utf8.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #2 : 02-02-2019 17:47 » 

Спасибо, это я и сам знаю, ключ canonical сортирует по алфавиту, а мне хотелось бы, чтобы сортировал именно так, как в хэше ключи расположены, т.е. просто тупо преобразовывал  ИСХОДНЫЙ хэш в  ИСХОДНУЮ-json строку.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 02-02-2019 18:15 » 

Т.е. ты хочешь поведение как в PHP. Нет, это невозможно. Если кровь из носа надо, храни порядок ключей и делай генерацию JSON сам. Не знаю, где такое может пригодиться, кроме как при проверке подписи по специально сформированной строке.

И на счет "рандомно". Не рандомно, а согласно порядку ключей в хеше. Т.е. порядок вполне определенный и не рандомный. Начиная с perl 5.18 в хеш-функцию подмешивается дополнительное значение (типа security). Это значение определяется рандомно на момент создания хеша. Соотв., единожды перемешавшись, ключи будут выводиться каждый раз в одном порядке.
« Последнее редактирование: 02-02-2019 18:32 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #4 : 03-02-2019 03:29 » new

Т.е. ты хочешь поведение как в PHP. Нет, это невозможно. Если кровь из носа надо, храни порядок ключей и делай генерацию JSON сам. Не знаю, где такое может пригодиться, кроме как при проверке подписи по специально сформированной строке.

И на счет "рандомно". Не рандомно, а согласно порядку ключей в хеше. Т.е. порядок вполне определенный и не рандомный. Начиная с perl 5.18 в хеш-функцию подмешивается дополнительное значение (типа security). Это значение определяется рандомно на момент создания хеша. Соотв., единожды перемешавшись, ключи будут выводиться каждый раз в одном порядке.
Да, пришлось самому извращаться, куда деваться. Спасибо, что нашли время моей проблемой заняться, спс.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines