2011-04-25 133 views
3

我有一个问题,把我的数据转换成json,我不知道为什么。Perl把数据转换成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)

我看到我的代码程序之间没有差异显示第一和一个....

它只是写道:“空”早在文本文件...

任何想法?

+0

因为现在你的单引号不会插入'$ file'变量,所以你需要在第二个参数的'open'周围使用双引号。更好的办法是使用3参数形式'open INPUT',''',$ file' – 2011-04-25 19:49:27

+0

我的问题是,它写回“012”行 - > print WF $ json-> encode($ self)。 “\ n”; < - 我可以打开文件等(我编辑代码..错误。抱歉:D有一个路径在我原来的代码,而不是'$文件'。 ) – Prexx 2011-04-25 19:51:11

+0

是否将“子编辑”称为方法?即“$ thing-> edit()”? – 2011-04-25 19:52:53

回答

1

我不是JSON专家,但encode方法有麻烦与一个幸运的参考。使用unblessed参考似乎是一个有效的解决方法:

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

这就是为什么我启用它 - > $ json-> allow_blessed(1); < - 你的代码将无法正常工作,无论如何感谢您的帮助。 – Prexx 2011-04-25 20:02:51

+0

嗯,但你的权利......有幸福参考的问题原因...我保存在一个tmp标量的数据和编码,现在它的工作。谢谢:)) – Prexx 2011-04-25 20:08:45

+0

查看['JSON'](http://search.cpan.org/perldoc?JSON)文档,'JSON :: allow_blessed'将在一个祝福的对象传递给'encode'时抑制异常。但编码祝福的对象需要你(1)调用'$ json-> convert_blessed(1)'和(2)实现一个'TO_JSON'对象方法,它返回值进行编码。这个值也必须是一个没有意义的参考。 – mob 2011-04-25 20:31:54

1

我第二个概念(因为你已经发现的),问题是有福的参考,但是我为您提供另一种解决方案(该是Perl的毕竟:TIMTOWTDI )。 Acme::Damn模块允许你解除(即该死)一个对象。因此,您应该能够:

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

此外,我觉得我不得不分享,因为该方法如此巧妙地命名。

+0

我会注意到:)谢谢。 – Prexx 2011-04-26 09:28:08

-1

遵循最后一个怪物的建议,这里是一个简单的例子,如何序列化有福的参考。

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来实现完整的往返行程。