JSON::SyckよりJSON::XSを使った方がいいよという話
お話
deal「循環参照してるハッシュrefをJSON::Syckでダンプしようとするとこける」
http://gist.github.com/199093
kt「それJSON::XSで」
以上。イイハナシダナー
おまけ
ハッシュrefのキーが複数あったとして、
- 複数のキーが同じ変数を参照していたり
- あるキーの値が別のキーの値を参照している
ときに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出来た。