2011-04-25 132 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來實現完整的往返行程。