Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSON модуль, сохраняющий порядок ключей 
:(
    Опции темы
Logo
Дата 26.3.2012, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть ли в Perl модуль, который помнит порядок ключей json в исходной строке?
т.е. так, что бы например в
'{"a":1,"b":2,"c":3}'
изменить b, и вернуть строку json с тем же порядком a, b, c?
PM MAIL   Вверх
Pfailed
Дата 26.3.2012, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 22
Всего: 39



Можно попробовать занаследоваться от любого существующего класса, который умеет парсить JSON и переопределить метод, где собственно парсится JSON объект (в Perl получается hash). Вместо обычного хеша нужно использовать хеш, который сохраняет последовательность добавляемых элементов, например я нашел Tie::IxHash.


--------------------
PM MAIL   Вверх
reiserford
Дата 26.3.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 22
Регистрация: 20.3.2012

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



Data::Dumper умеет и сохранять порядок ключей, и, если задать соотв. параметры, выводить данные в json-виде.
PM   Вверх
Pfailed
Дата 27.3.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 22
Всего: 39



Если тс так и не смог решить задачу, вот моё решение:
Код

use strict;
use Tie::IxHash;
use JSON::PP;

# magic start

my $obj_parser_sub = \&JSON::PP::object;
*JSON::PP::object = sub {
    tie my %obj, 'Tie::IxHash';
    $obj_parser_sub->(\%obj);
};

# magic end

# test it
use Data::Dumper;

my $res = decode_json('{"a":1,"b":2,"c":3}');
print Dumper $res;

$res->{b} = 'xx';
print encode_json($res), "\n";

Решить задачу через наследование не удалось,  JSON::PP не спроектирован для наследования. Зато через переопределение всё делается очень коротко, достаточно было взглянуть на код JSON::PP.



--------------------
PM MAIL   Вверх
Logo
Дата 28.3.2012, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо smile
PM MAIL   Вверх
tishaishii
Дата 28.3.2012, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Код
package Project ;
use strict ;
use Tie::IxHash ;

#no magick
use base qw (JSON::PP) ;

sub object {
    my $self = shift ( @_ ) ;
    my %obj ;

    if ( tie ( %obj , 'Tie::IxHash' ) ) {
         #####################
         $self -> SUPER::object ( \%obj ) ;
         #####################
    }

    return ( \%obj ) ;
}

#no magick 

PM MAIL ICQ Skype   Вверх
Pfailed
Дата 28.3.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 22
Всего: 39



tishaishii, ваше решение не работает. Посмотрите код JSON::PP.


--------------------
PM MAIL   Вверх
Logo
Дата 2.4.2012, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Интересно, JSON::XS уже наверно будет не так просто изменить...
PM MAIL   Вверх
Pfailed
Дата 2.4.2012, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 22
Всего: 39



Logo, ага, похоже только модификация исходного кода поможет.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




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


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

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