Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PerlとJSON / Perl and JSON
Search
papix
May 24, 2019
Technology
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PerlとJSON / Perl and JSON
papix
May 24, 2019
More Decks by papix
See All by papix
Houtou.pm #1
papix
0
1.9k
Perl歴約10年のエンジニアがフルスタックTypeScriptに出会ってみた
papix
1
760
YAPC::Kyotoの「全て」 / All of "YAPC::Kyoto"
papix
0
1.7k
イベントの中の人 / Inside the Events
papix
0
370
2022年に始めるPerlでWebサービス開発(趣味)
papix
0
640
ワーケーションに関する考察
papix
3
2.3k
(今更)Amplifyさっくり体験
papix
0
930
はてなにおけるGitHub Actions活用事例 / GitHub Actions in Hatena
papix
0
2.9k
ミススペルを発見するmisspellのご紹介 / Introduce misspell
papix
0
1.3k
Other Decks in Technology
See All in Technology
20260801_スクフェス大阪
kgnkhkr
1
1.1k
AIは実装を速くする。では、私たちは何を今作るべきか?-立場を越えてリリースに向き合ったチーム開発の実践 / 20260801 Hiromi Nakaya and Naoki Takahashi
shift_evolve
PRO
3
380
TypeScript入門 2026
recruitengineers
PRO
1
300
組織にどうSREを根付かせるか?〜IVRyの場合〜
abnoumaru
0
320
モダンフロントエンド 開発研修
recruitengineers
PRO
1
340
サイバー捜査員研修(後半)
nomizone
1
600
個人OSSが、机の上から世界に広がるまでの話
shinyasaita
1
340
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
200
事業価値と Engineering 2026年度版
recruitengineers
PRO
32
16k
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
100
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
200
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
From π to Pie charts
rasagy
0
250
KATA
mclloyd
PRO
35
15k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
460
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
250
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
360
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Building Adaptive Systems
keathley
44
3.2k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
PerlとJSON id:papix (@__papix__) 株式会社はてな
papix 株式会社はてな アプリケーションエンジニア (2017年2月~) シニアエンジニア (2019年2月~) ブログMediaチーム サービスリード兼スクラムマスター 「はてなブログ」をつくっています アカウント類
はてな: id:papix Twitter: @__papix__ GitHub: papix / CPAN: PAPIX ブログ: https://papix.hatena(blog.(com|jp)|diary.jp)/ 趣味はPerlと, (交通機関を利用した)旅行 JGC修行は完遂済み, 今年はSFC修行をしています
JSON JavaScript Object Notation JavaScript Object Notation (JSON 、ジェイソン)は軽量な データ記述言語の1
つである。構文はJavaScript におけるオブジ ェクトの表記法をベースとしているが、JSON はJavaScript 専用の データ形式では決してなく、様々なソフトウェアやプログラミング 言語間におけるデータの受け渡しに使えるよう設計されている。 by Wikipedia Perlでも, JSONを扱うライブラリが用意されている
Perl界の(代表的な)3つのJSON JSON::PP JSON::XS JSON
JSON::PP PP(Pure Perl)実装のJSONモジュール v5.13.9よりコアモジュール perl コマンド単体で動かしたいスクリプトならJSON::PPを 使っておくと良い
JSON::XS XSを使ったJSONの実装 XSを使って, C言語のコードやライブラリとPerlを繋いで実装 しているので(Pure Perlよりも)高速 cpanfile などに書いていて, JSON::XSがある環境なら明示的に JSON::XSを使えばよい
コアモジュールではない
JSON JSON::XSがあればそれを, なければJSON::PPを使ってくれる モジュールなどで, よしなに使わけて欲しい時はJSONを使って おけばよい コアモジュールではない
まだまだあるJSONファミリー Cpanel::JSON::XS Cpanelという会社が実装した, XSを使ったJSON JSON::MaybeXS Cpanel::JSON::XSとJSON::XSとJSON::PPをよしなに使って くれる
JSONことはじめ JSON::XSを例に, Perlで実際にJSONを扱う例を紹介していきます
PerlのHash/ArrayリファレンスをJSONにする use JSON::XS qw(encode_json); my $json = encode_json({ a =>
1, b => 2 }); print $json; # => {"a":1,"b":2}
JSONをPerlのデータ構造にする use JSON::XS qw(decode_json); use Data::Dumper; my $ref = decode_json('{"a":1,"b":2}');
print Dumper $ref; # $VAR1 = { # 'a' => 1, # 'b' => 2 # };
ちなみに... decode_json は, JSON::XS->new->utf8->decode と同じ encode_json は, JSON::XS->new->utf8->encode と同じ use
JSON::XS; my $json = JSON::XS->new->utf8->encode( { a => 1, b => 2, c => 3 } );
こういう時はどうする?
JSONにする時, Hash Randomizationを回避したい Perl 5.18以降, Hash Randomizationが導入された PerlのHash/ArrayリファレンスをJSONにするとき, キーの順序 が不順になることがある
use JSON::XS qw(encode_json); my $json = encode_json({ a => 1, b => 2, c => 3 }); print "$json\n"; $ perl json.pl {"c":3,"a":1,"b":2} $ perl json.pl {"a":1,"c":3,"b":2} $ perl json.pl {"b":2,"c":3,"a":1}
JSONにする時, Hash Randomizationを回避したい 解決策としては, Canonicalモードを使う キーをソートした上でJSONにしてくれる use JSON::XS; my $json
= JSON::XS->new->utf8->canonical->encode( { a => 1, b => 2, c => 3 } ); print "$json\n"; # {"a":1,"b":2,"c":3}
JSONにするとき, オブジェクトが含まれていても無視したい PerlのHash/ArrayリファレンスをJSONにするとき, 通常オブジェク トが含まれると例外になる encountered object 'Obj=HASH(0x7ff069003418)', but neither
allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) use JSON::XS qw(encode_json); my $hash = { a => 1, b => Obj->new, }; my $json = encode_json($hash); # XXX
JSONにするとき, オブジェクトが含まれていても無視したい allow_blessed をOnにすると, オブジェクトは無視して null に してくれる use JSON::XS
qw(encode_json); my $hash = { a => 1, b => Obj->new, }; my $json = JSON::XS->new->utf8->allow_blessed->encode( $hash ); print $json; # => {"a":1,"b":null}
JSONにするとき, オブジェクトもよしなにJSONにしたい オブジェクト側に TO_JSON メソッドを用意しておけば, オブジェク トの TO_JSON の返り値でJSONを作ってくれる use
JSON::XS; my $hash = { a => 'b', c => Obj->new, }; my $json = encode_json($hash); print $json; # => {"a":"b","c":{"cc":11}} package Obj; sub new { bless {}, $_[0] } sub TO_JSON { {cc => 11} }
JSONにするとき, 型を明示したい JSON::Typesを使いましょう use JSON::XS; use JSON::Types; my $hash =
{ number => JSON::Types::number 1, string => JSON::Types::string 1, bool => JSON::Types::bool 1, }; my $json = encode_json($hash); print $json; # {"number":1,"string":"1","bool":true}
JSON::Types 実装は素朴 sub number($) { return undef unless defined $_[0];
$_[0] + 0; } sub string($) { return undef unless defined $_[0]; $_[0] . ''; } sub bool($) { $_[0] ? \1 : \0; }
ちなみに... booleanについては, (Perlに存在しない概念なので)decodeするとき にどうなるかはライブラリごとに決まっている 例えば, JSON::XSなら, true は $Types::Serialiser::true に,
false は $Types::Serialiser::false にデコードされる 更に, boolean_values を使って, JSONの true / false をデ コードするときの値を上書きすることができる
まとめ PerlにはJSONを扱うための道具がいろいろある そしてJSONをよしなに扱うテクニックがいろいろある PerlとJSONとうまくつきあっていきましょう