だるろぐ

だるいぶろぐです

JSON::SyckよりJSON::XSを使った方がいいよという話

お話

deal「循環参照してるハッシュrefをJSON::Syckでダンプしようとするとこける」
http://gist.github.com/199093
kt「それJSON::XSで」

以上。イイハナシダナー

おまけ

ハッシュrefのキーが複数あったとして、

  1. 複数のキーが同じ変数を参照していたり
  2. あるキーの値が別のキーの値を参照している

ときにJSON::SyckでそのハッシュrefをダンプしようとするとコケるけどJSON::XSだと大丈夫だよっていう話。
こういう変な事になってる状態を循環参照と言うそうだ。初めて知っただけど何に使うのって思ったんだけど、手法じゃなくてバグの一種のようで。
あとSyckよりXSの方が圧倒的に速いからやっぱXS使った方がいいそうで。

use strict;
use warnings;
use Data::Dumper;sub p {warn Dumper shift;my @c = caller;print STDERR "  at $c[1]:$c[2]\n\n"}
use JSON::Syck;
use JSON::XS;

my $ha = { hoge => 'fuga' };
my $hb = { foo => $ha, bar => $ha };
p $hb;
{
    local $@;
    eval {p JSON::Syck::Dump($hb)};
    p $@ if $@;
}
p JSON::XS::encode_json($hb);

my $hc = { a => { aa => 1 }, b => 2, c => 3 };
$hc->{d} = $hc->{a};
p $hc;
{
    local $@;
    eval {p JSON::Syck::Dump($hc)};
    p $@ if $@;
}
p JSON::XS::encode_json($hc);
% perl dump.pl
$VAR1 = {
          'bar' => {
                     'hoge' => 'fuga'
                   },
          'foo' => $VAR1->{'bar'}
        };
  at dump.pl:9

$VAR1 = 'Dumping circular structures is not supported with JSON::Syck at dump.pl line 12.
';
  at dump.pl:13

$VAR1 = '{"bar":{"hoge":"fuga"},"foo":{"hoge":"fuga"}}';
  at dump.pl:15

$VAR1 = {
          'c' => 3,
          'a' => {
                   'aa' => 1
                 },
          'b' => 2,
          'd' => $VAR1->{'a'}
        };
  at dump.pl:19

$VAR1 = 'Dumping circular structures is not supported with JSON::Syck at dump.pl line 22.
';
  at dump.pl:23

$VAR1 = '{"c":3,"a":{"aa":1},"b":2,"d":{"aa":1}}';
  at dump.pl:25


ところでSyck|XSっていえばYAMLを思い出すんだけど、こっちはどっちでも問題なくDump出来た。