JSON(JavaScript Object Notation)をパースするとは? quicktypeというサービスがアツいらしい

かずきのBlog@hatena さんのブログで紹介されていてたツールで、

quicktype.io

というサービスがナウい感じだそうです。

⇩   かずきのBlog@hatena さんのブログ

blog.okazuki.jp

quicktypeについては、上記サイト様を参照していただくということで。

 ということで、いまいち、JSONの理解について曖昧模糊とした感が否めないことこの上ないので、JSONがどんなものか改めて調査してみました。

 

JSONJavaScript Object Notation)とは?

そも、JSON とは何ぞや?

JSON(ジェイソン、JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptにおけるオブジェクトの表記法をベースとしているが、JSONJavaScript専用のデータ形式では決してなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しに使えるよう設計されている。

JSONは多くのプログラミング言語で利用可能である。例えば、ActionScriptCC++C#ColdFusionCommon LispCurlD言語DelphiEErlangGroovyHaskellJavaJavaScript (ECMAScript), LispLuaMLObjective CAMLPerlPHPPythonRRebolRubyScalaSqueakなど。

JavaScript Object Notation - Wikipedia

コンピューターが扱えるようにしたものがデータ記述言語(データ言語)ということらしく、 いろいろな種類があり

  • JSONJavaScript Object Notation)
  • XML(Extensible Markup Language)
  • HTML(HyperText Markup Language)
  • YAMLYAML Ain't a Markup Language)
  • CSV (Comma Separated Vector)

このへんが有名ですかね、というか他にどんなものがあるのかよく分からんですが...。 で、Web界隈では有名なAjax(Asynchronous JavaScript + XML)などでJSON形式のデータをやり取りしたりすることが多いようです。

AjaxはGoogleMapで一躍有名になった技術ですね。

 

JSONをパースするとは?

JSONJavaScript Object Notation)は名前の通り、JavaScriptのオブジェクトの表記法をベースとしたデータ形式であるため、例えばブラウザ側からJavaScriptなどでサーバー側のJavaなどに渡されるとします。

JavaJSONを受け取ろうとすると、当然、そんなデータの形(JSON)は理解できないってことになるため、Javaで処理できるようにJSONをパース(解析)することが必要なわけです、たぶん。

JavaでのJSONを扱うライブラリとしては、 

qiita.com

⇧  上記サイト様によると、

Library License Link
org.json JSON MVNRepository.com
Jackson Apache License 2.0 GitHub / MVNRepository.com
JSONIC Apache License 2.0 Official site / MVNRepository.com
Gson Apache License 2.0 GitHub / MVNRepository.com
JsonPath Apache License 2.0 GitHub / MVNRepository.com

といったライブラリを利用していく形になるようです。 

 

JSONシリアライズ,デシリアライズとは?

JSONをパース(解析)することを「デシリアライズ」というらしいです。逆にJavaなどのデータをJSONに変換することを「シリアライズ」というようです。

ちょっと、いまいち「パース」「シリアライズ」「デシリアライズ」の用語の関係性がつかみきれていないのですが、Javaの場合で考えると、

となるようですね。

クライアントでJavaScript、サーバーでJavaを使う場合(JSONデータ取扱)の想像図

f:id:ts0818:20171123205338p:plain

⇧  みたいなイメージですかね。JSONで送って、JSONで返すみたいな。ちなみに、サーバー間同士でもJSONでやり取り可能みたいですね。

 

データをブラウザとサーバー間でやり取りする際には避けて通ることができないと思われるため、シリアライズ、デシリアライズを如何にシームレスに行うことができるかがユーザビリティの向上に影響しそうですね。 

JSONはテキスト形式のデータであるため、バイナリ形式のデータに比べるとどうしても「シリアライズ」「デシリアライズ」に時間を取られてしまうようです。

 

ちなみに、面白法人カヤックさんで開発してらっしゃる方のブログで、 

techblog.kayac.com

「Protocol Buffers」というものを知り、Qittaの tayama0324 - Qiita さんの記事で、

qiita.com

「MessagePack」 というものの存在を知りました。「FlatBuffers」というものも存在するようですね。

汎用シリアライズ方法(MessagePack/Protocol Buffers/FlatBuffers) - sambaiz-net

 

速度にシビアなゲーム業界で利用されているC#などでは、「ZeroFormatter」なるものも存在するようですね。

github.com

neue cc - ZeroFormatter - C#の最速かつ無限大高速な .NET, .NET Core, Unity用シリアライザー

⇧  上記の「ZeroFormatter」を作成しているのは日本の方みたいですね。

 

「JsonUtility」なるものも存在すると。

qiita.com

「Thrift(Apache Thrift)」なるもの存在すると。

Apache Thrift(アパッチ スリフト)は、「スケーラブルな言語間サービス開発」のためにFacebookにて開発された遠隔手続き呼出し (RPC) フレームワークである。これはソフトウェアスタックとコード生成エンジンを組み合わせることで、C++C#JavaPerlPythonPHPErlangRubyなどの言語間にて効率的かつシームレスに動作するサービスを開発することを可能とする。

Apache Thrift - Wikipedia

github.com

これだけ様々なライブラリが出ているとは、時はまさにシリアライザー戦国時代...

JSONについても学習していかねばですね。