Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > JSON модуль, сохраняющий порядок ключей


Автор: Logo 26.3.2012, 05:26
Есть ли в Perl модуль, который помнит порядок ключей json в исходной строке?
т.е. так, что бы например в
'{"a":1,"b":2,"c":3}'
изменить b, и вернуть строку json с тем же порядком a, b, c?

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

Автор: reiserford 26.3.2012, 11:59
Data::Dumper умеет и сохранять порядок ключей, и, если задать соотв. параметры, выводить данные в json-виде.

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

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.

Автор: Logo 28.3.2012, 01:12
Спасибо smile

Автор: tishaishii 28.3.2012, 15:32
Код
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 

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

Автор: Logo 2.4.2012, 04:00
Интересно, JSON::XS уже наверно будет не так просто изменить...

Автор: Pfailed 2.4.2012, 09:45
Logo, ага, похоже только модификация исходного кода поможет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)