JSONモジュールの encode_json / decode_json と to_json / from_json について調べてみた。

間違いがあった場合は指摘お願いします。

encode_json / decode_json

encode_json / decode_json は Encodeモジュールの encode_utf8 / decode_utf8 にJSONのシリアライザー・デシリアライザーがくっ付いたようなもの。

to_json / from_json

その一方、to_json / from_json は引数・戻り値共に flagged utf8 で扱う。JSONのシリアライザー・デシリアライザーのみ。

よって、エンコード周りに関しては自分で責任を持ってやる必要がある。

utf8(追記:コメントの指摘により加筆修正)

OOインターフェイスには utf8 メソッドがある。

引数が true もしくは「引数なし」では Enable となり、下記のようになる。 Disable にするには0(falseになる値)をセットする。

get_utf8 で現在の状態が確認できる。デフォルトはDisable

JSON->new->get_utf8 ? print "true" : print "false"; # false
encode_json と JSON->new->utf8->encode は同義
$json_text = encode_json $perl_scalar;
$json_text = JSON->new->utf8->encode ($perl_scalar);
decode_json と JSON->new->utf8->decode ($json_text) は同義
$perl_scalar = decode_json $json_text;
$perl_scalar = JSON->new->utf8->decode ($json_text);
to_json と JSON->new->encode は同義
$json_text = to_json($perl_scalar);
$json_text = JSON->new->encode($perl_scalar);
from_json と JSON->decode は同義
$perl_scalar = from_json($json_text);
$perl_scalar = JSON->decode($json_text);

サンプルコード

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use Encode;
use Data::Dumper;
use JSON;

my $v_1 = {
    name => 'いろはにほへと',
    value => 'ちりぬるを',
};

my $v_2 = {
    name => 'わかよたれそ',
    value => 'つねならむ',
};

my $v_3 = {
    name => 'うゐのおくやま',
    value => 'けふこへて',
};

$v_1->{name}  = encode_utf8 $v_1->{name};
$v_1->{value} = encode_utf8 $v_1->{value};

say 'Wrong!!! ' . encode_json $v_1; # 多重エンコードしていることになる

say "Right: " .  encode_json $v_2;

say "Right: " .  encode_utf8 to_json($v_3);

my $to_json = to_json($v_3);
print Dumper "Right: ", from_json $to_json;

exit;

1;
__END__

# output

Wrong!!! {"value":"ちりぬるを","name":"いろはにほへと"}
Right: {"value":"つねならむ","name":"わかよたれそ"}
Right: {"value":"けふこへて","name":"うゐのおくやま"}

$VAR1 = 'Right: ';
$VAR2 = {
          'value' => "\x{3051}\x{3075}\x{3053}\x{3078}\x{3066}",
          'name' => "\x{3046}\x{3090}\x{306e}\x{304a}\x{304f}\x{3084}\x{307e}"
        };

追記(2010.04.18)

あわせてこちらも

http://www.donzoko.net/cgi-bin/tdiary/20100406.html#p0

http://www.donzoko.net/cgi-bin/tdiary/20080329.html#p01

latin1とasciiについてmakamakaさんに教えていただきました。

http://togetter.com/li/15145