Perl для преобразования данных в формат JSON - PullRequest
3 голосов
/ 25 апреля 2011

У меня проблема с преобразованием моих данных в json, и я не знаю почему.

Вот код, который работает:

#constructor
sub new {
  my $class = shift;
  my $Titel = shift;
  my $Text = shift;
  my $Time = localtime;
  my $self = {};

  $self->{text} = $Text;
  $self->{create} = $Time;
  $self->{edit} = $Time;

  my $json = JSON::XS->new();

  open WF, '>> $file' || die "Error : $!";
  print WF $json->encode($self)."\n";
  close WF;

  bless $self, $class;
}

Я создаю «объект»и сохранить данные в текстовом файле (через JSON) тоже.

У меня проблемы, если я пытаюсь редактировать некоторые данные:

sub edit {
my $self = shift;
my $Text = shift;
my $ID = shift;
my $Time = localtime;
my $json = JSON::XS->new();
$json->allow_blessed(1);

$self->{text} = $Text; #edit text
$self->{edit} = $Time; # edit date

open INPUT, '< $file' || die "Error : $!";
my @data = <INPUT>;
close(INPUT);

open WF, '> $file' || die "Error : $!";

for (my $Count=0; $Count<=$#data; $Count++){
    chomp($data[$Count]);

    if($Count == $ID){#if line of data found, who is going to be edited
        print WF $json->encode($self)."\n";
    }else{
        print WF $data[$Count]."\n";
    }
}

close WF;
}

Что я пытаюсь сделать, это просто редактироватьодна строка в текстовом файле .. (если у вас есть идея получше, пожалуйста, покажите мне: D)

Я не вижу разницы между моей процедурой в коде, показанном первым, и этим ...

он просто пишет «ноль» обратно в текстовый файл ...

Есть идеи?

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Я придерживаюсь мнения (как вы уже нашли), что проблема является благословенной ссылкой, однако я предлагаю вам другое решение (в конце концов, это Perl: TIMTOWTDI).Модуль Acme :: Damn позволяет разблокировать (т.е. проклять) объект.Поэтому вы должны быть в состоянии:

print WF $json->encode(damn($self))."\n";

Также я чувствовал, что должен был поделиться, так как метод так хитро назван.

1 голос
/ 25 апреля 2011

Я не эксперт JSON, но у метода encode возникли проблемы с благословенной ссылкой. Использование необъявленной ссылки кажется правильным решением:

if($Count == $ID){#if line of data found, who is going to be edited
    print WF $json->encode( {%$self} )."\n";
...
0 голосов
/ 26 апреля 2011

Следуя совету последнего моба, вот простой пример того, как сериализовать благословенные ссылки.

package Node;

sub new {
    my $class = shift;
    bless { @_ }, $class;
}

sub TO_JSON {
    my $self = shift;
    return { class => 'Node', data => { %$self } };
}

package main;

use JSON;

my $node_hash = {
    a => [ 'text1', 'text2' ],
    b => [ 'what',  'is', 'this' ],
    c => [ Node->new(some => 'data') ],
};

print to_json($node_hash, { convert_blessed => 1 });

Однако вам необходимо обратить внимание при декодировании.Можно использовать filter_json_single_key_object для реализации полного обхода.

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