【问题标题】:Perl to convert data into JSON formatPerl 将数据转换为 JSON 格式
【发布时间】:2011-08-12 13:14:17
【问题描述】:

我有一个问题,将我的数据转换成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)

我发现我在第一个显示的代码中的过程与那个过程之间没有区别......

它只是在文本文件中写回“null”...

有什么想法吗?

【问题讨论】:

  • 您需要在 open 的第二个参数周围使用双引号,因为您现在拥有的单引号不会插入 $file 变量。更好的是使用 3 参数形式 open INPUT, '&lt;', $file
  • 我的问题是,它在行中写回“null” -->print WF $json->encode($self)."\n";
  • “子编辑”是否被称为方法?即“$thing->edit()”?
  • 是的。我调试了它,当我调用编辑方法时,$self 是正确的。我也可以在我的程序中编辑值。只有文本文件中的写回不起作用(只需在较低的代码 sn-p! 中它完美地工作)。

标签: json perl


【解决方案1】:

我不是 JSON 专家,但 encode 方法在使用受祝福的引用时遇到了麻烦。使用 unblessed 引用似乎是一种有效的解决方法:

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

【讨论】:

  • 这就是我启用它的原因 -->$json->allow_blessed(1);
  • 嗯,但你说得对……祝福参考存在问题……我将数据保存在一个 tmp 标量中并对其进行编码……现在它可以工作了。谢谢:))
  • 查看JSON 文档,JSON::allow_blessed 将在将祝福对象传递给encode 时抑制异常。但是对祝福对象进行编码需要 (1) 还调用 $json-&gt;convert_blessed(1) 和 (2) 实现一个 TO_JSON 对象方法,该方法返回要编码的值。这个值也必须是一个无祝福的引用。
【解决方案2】:

我支持这个概念(正如您已经发现的那样),问题是受祝福的引用,但是我为您提供了另一种解决方案(毕竟是 Perl:TIMTOWTDI)。 Acme::Damn 模块允许您取消祝福(即该死)一个对象。因此,您应该能够:

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

我也觉得我必须分享,因为这个方法的名字很巧妙。

【讨论】:

    【解决方案3】:

    按照最后一个暴徒的建议,这里是一个简单的例子,如何序列化祝福引用。

    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实现全程往返。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2016-08-05
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多