2011-09-07 json
PHPの場合。
<?php | |
$json_str = '{"hoge":"ほげ", "fuga":"ふが"}'; | |
$json = json_decode( $json_str ); | |
echo $json->hoge; // ほげ | |
echo $json->fuga; // ふが |
Perlの場合。ちょっと面倒...
#!/usr/bin/perl | |
use strict; | |
use warnings; | |
use JSON; | |
use Encode; | |
my $json_str = '{"hoge":"ほげ","fuga":"ふが"}'; | |
my $json = JSON->new->utf8(0)->decode( decode_utf8( $json_str ) ); | |
print encode('utf8', $json->{hoge} ); # ほげ | |
print encode('utf8', $json->{fuga} ); # ふが |
それと、こういう階層のJSONを扱う場合、
{
"status":200,
"data":[
{"id":1, "name":"mgng" },
{"id":2, "name":"mgng2"}
]
}
PHPだと素直に書けるんだけど、
<?php | |
$json_str = '{"status":200,"data":[{"id":1,"name":"mgng"},{"id":2,"name":"mgng2"}]}'; | |
$json = json_decode( $json_str ); | |
$data = $json->data; | |
echo $data[0]->id; // 1 | |
echo $data[0]->name; // mgng |
Perlも同じように処理すると「Pseudo-hashes are deprecated」エラーが出る(JSON モジュールのバージョンは 2.17)
#!/usr/bin/perl | |
use strict; | |
use warnings; | |
use JSON; | |
use Encode; | |
my $json_str = '{"status":200,"data":[{"id":1,"name":"mgng"},{"id":2,"name":"mgng2"}]}'; | |
my $json = JSON->new->utf8(0)->decode( decode_utf8( $json_str ) ); | |
my @data = $json->{data}; | |
print $data[0]->{id}; # Pseudo-hashes are deprecated | |
print $data[0]->{name}; # Pseudo-hashes are deprecated |
decode失敗してんのかな...ためしに Data::Dumper使って $data[0] を見てみると、
[
{
'name' => 'mgng',
'id' => 1
},
{
'name' => 'mgng2',
'id' => 2
}
]
ぬぬ、なんかもういっこ配列でくくられてる... ということで、こうしたら無事表示された。
#!/usr/bin/perl | |
use strict; | |
use warnings; | |
use JSON; | |
use Encode; | |
my $json_str = '{"status":200,"data":[{"id":1,"name":"mgng"},{"id":2,"name":"mgng2"}]}'; | |
my $json = JSON->new->utf8(0)->decode( decode_utf8( $json_str ) ); | |
my @data = $json->{data}; | |
print $data[0][0]->{id}; # 1 | |
print $data[0][0]->{name}; # mgng |
JSONモジュールのバグなのか仕様なのかは調べてないけど、[0][0]キモい...