犬ターネット

utf-8なJSON文字列をPHPとPerlで扱うメモ

2011-09-07 json

PHPの場合。

<?php
$json_str = '{"hoge":"ほげ", "fuga":"ふが"}';
$json = json_decode( $json_str );
echo $json->hoge; // ほげ
echo $json->fuga; // ふが
view raw 1.php hosted with ❤ by GitHub

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} ); # ふが
view raw 2.pl hosted with ❤ by GitHub

それと、こういう階層の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
view raw 3.php hosted with ❤ by GitHub

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
view raw 4.pl hosted with ❤ by GitHub

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
view raw 5.pl hosted with ❤ by GitHub

JSONモジュールのバグなのか仕様なのかは調べてないけど、[0][0]キモい...


24時間切った

右翼メモ