Hatena::ブログ(Diary)

punitan (a.k.a. punytan) のメモ このページをアンテナに追加 RSSフィード

Fork me on GitHub

2010-04-10

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

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)

あわせてこちらも

どんぞこ日誌(2010-04-06)

どんぞこ日誌(2008-03-29)

latin1とasciiについてmakamakaさんに教えていただきました。その内容をまとめました。

JSON.pm - Togetter

名無しさん名無しさん 2010/04/11 11:57 JSON->new->utf8はJSON->new->utf8(1)と等価で、
JSON->new->get_utf8はfalseなので、デフォルトはutf8=disableみたいです。

punitanpunitan 2010/04/11 14:12 > 名無しさん

> デフォルトは Enable なので、下記のようになる。 Disable にするには0(falseになる値)をセットする
だと語弊があるので修正しておきました。

makamaka_at_donzokomakamaka_at_donzoko 2010/04/16 12:44 手前味噌ですが、こちらのページも何かのお役に立てれば幸いです。 http://www.donzoko.net/cgi-bin/tdiary/20100406.html#p01【(en|de)code_jsonと(to|from)_jsonについて】

punitanpunitan 2010/04/17 01:44 > makamaka_at_donzokoさん
ありがとうございます。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/punitan/20100410/1270927420