Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
PerlとJSON / Perl and JSON
papix
PRO
May 24, 2019
Technology
1
380
PerlとJSON / Perl and JSON
papix
PRO
May 24, 2019
Tweet
Share
More Decks by papix
See All by papix
2022年に始めるPerlでWebサービス開発(趣味)
papix
PRO
0
170
ワーケーションに関する考察
papix
PRO
3
1.6k
(今更)Amplifyさっくり体験
papix
PRO
0
730
はてなにおけるGitHub Actions活用事例 / GitHub Actions in Hatena
papix
PRO
0
1.1k
ミススペルを発見するmisspellのご紹介 / Introduce misspell
papix
PRO
0
680
「知らなかった」を聞きに行く 〜海外カンファレンス参加のススメ〜 / builderscon 2019
papix
PRO
0
250
Perl in Japan
papix
PRO
0
2.1k
Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl
papix
PRO
1
1k
1on1をするときに考えていること / 1on1
papix
PRO
0
1k
Other Decks in Technology
See All in Technology
2022 COSCUP - GKE Backend Cluster 除雷分享
brentchang
0
120
DevelopersIO 2022 俺のTerraform Pipeline
takakuni
0
430
IBM Cloud Festa Online 2022 Summer
1ftseabass
PRO
0
200
VS Code Meetup #21 - もう一度知りたい基礎編 - ファイル操作、コーディングの基本編
74th
0
190
インフラのテストに VPC Reachability Analyzer は外せないという話
nulabinc
PRO
2
710
疎ベクトル検索と密ベクトル検索: 第68回 Machine Learning 15minutes! Broadcast
keyakkie
1
250
データ分析のためのAWS Well-Architected -Data Analytics Lens-
maru1981
0
230
SPAとWebアプリケーションでCognitoの使い方はどう変わるのか? / How do we use cognito with SPA and web applications?
kitano_yuichi
0
380
森林情報のオープンデータと QGISでの利用
kou_kita
0
270
GCCP Creator @ COSCUP 2022
line_developers_tw
PRO
0
1.4k
漫画で使えそうな背景画像をblenderを使って作ってみた!
nokonoko1203
1
280
cobra は便利になっている
nwiizo
0
140
Featured
See All Featured
Fontdeck: Realign not Redesign
paulrobertlloyd
73
4.1k
Done Done
chrislema
174
14k
Build your cross-platform service in a week with App Engine
jlugia
219
17k
Rebuilding a faster, lazier Slack
samanthasiow
62
7.3k
Infographics Made Easy
chrislema
233
17k
Web development in the modern age
philhawksworth
197
9.3k
The Invisible Customer
myddelton
110
11k
Scaling GitHub
holman
451
140k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
107
16k
What's in a price? How to price your products and services
michaelherold
229
9.4k
Designing for humans not robots
tammielis
241
24k
Three Pipe Problems
jasonvnalue
89
8.7k
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とうまくつきあっていきましょう