2011-04-25 4 views
3

데이터가 json으로 변환되는 데 문제가 있으며 그 이유를 모르겠습니다. 나는, 너무 '객체'를 만들고 (JSON 통해) TEXTFILE에 데이터를 저장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; 
} 

: 여기

작동 일부 코드이다.

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; 
} 

내가 뭘하려고하는 것은 당신이 더 나은 아이디어가있는 경우 (있습니다 .. TEXTFILE에서 하나 개의 행을 편집하는 것입니다, 저를 보여주십시오 : 나는 몇 가지 데이터를 편집하려고하면

나는, 문제가 : D) 내가 코드 내 절차 사이의 차이를 볼

가 먼저 표시하고 그냥 다시 TEXTFILE에 "널 (null)"글을 하나 ....

... 그

어떤 아이디어가?

+0

두 번째 인수는'open'에 큰 따옴표를 사용해야합니다. 이제는 작은 따옴표로'$ file' 변수를 보간하지 않기 때문입니다. 더 나은 방법은 3 개의 인수 형식을 사용하는 것입니다. 'open input', '<', $ file' –

+0

내 문제는 그 행에 "null"을 다시 쓰는 것입니다. -> print WF $ json-> encode ($ self). "\ n"; <- 파일을 열 수 있습니다. (코드를 잘못 편집했습니다. 죄송합니다. D : '$ file'이 아니라 원래 코드에 경로가 있습니다.) – Prexx

+0

메서드로 "하위 편집"이 호출 되었습니까? 즉 "$ thing-> edit()"? –

답변

1

저는 JSON 전문가는 아니지만 encode 메서드는 축복받은 참조에 문제가 있습니다. 그러나 나는 결국 펄입니다 (당신에게 다른 솔루션을 제공, 문제가 축복 참조입니다 (이미 발견으로) 나는 두 번째 개념

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

+0

흠,하지만 당신의 권리 ... 축복받은 참조의 문제가있었습니다 ... 저는 tmp 스칼라에 데이터를 저장하고 그 코드를 인코딩했습니다 ... 이제 작동합니다. 감사합니다 :)) – Prexx

+0

['JSON'] (http://search.cpan.org/perldoc?JSON) 문서를 보면'JSON :: allow_blessed'는 축 객체가'encode'에 전달 될 때 예외를 억제합니다. 그러나 축복 된 객체를 인코딩하려면 (1)'$ json-> convert_blessed (1)'을 호출하고 (2) 인코딩 할 값을 반환하는'TO_JSON' 객체 메소드를 구현해야합니다.이 값은 축약되지 않은 참조 여야합니다. – mob

1

: 은혜를 입지 못한 참조를 사용하여 올바른 해결 방법처럼 보인다 TIMTOWTDI). Acme::Damn 모듈을 사용하면 객체를 언 브레스 (unbless) (즉, 망할) 수 있습니다. 따라서 당신은 할 수 있어야 :이 방법은 너무 영리 이름 때문에

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

이 또한 내가, 내가 공유했다 느꼈다.

+0

감사드립니다. :) 감사합니다. – Prexx

-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을 사용할 수 있습니다.

관련 문제