JSONのシリアライズ・デシリアライズ(stringify・parse、Marshal・Unmarshal、dumps・loads、to_string・from_str、toJson・fromJson)チートシート

はじめに

毎回どれがどれだっけとなるので備忘録としてメモしておきます。

シリアライズとデシリアライズ

JSONの処理において、オブジェクトをJSON文字列に変換する処理の方が「シリアライズ(Serialize)」です。
オブジェクトは一般的にはkeyとvalueのペアが含まれており、構造化・階層化がなされています。
これを文字列という、メモリ上で直列に保持される単一の値に変換するため、直列化(シリアライズ)という単語によって表現されているようです。

一方のJSONの文字列をオブジェクトに変換する方は「デシリアライズ(Deserialize)」です。
これはシリアライズの逆で、JSON文字列をオブジェクトに変換します。

プログラミング言語毎の関数名

プログラミング言語によってはシリアライズ・デシリアライズ以外の単語を関数名としているケースがあります。

C#

C#は、素直にSerialize・Deserializeを関数名としています。
learn.microsoft.com

JavaScript

JavaScriptでは、 JSON.stringify()JSON.parse() という関数名となっています。
developer.mozilla.org
developer.mozilla.org
JSON文字列化する」、「(JSON文字列を解析して)オブジェクトにする」という意味では、分かりやすい関数名かなと思います。

Go

GoではMarshal・Unmarshalという単語を関数名としています。
pkg.go.dev
Marshalには、オブジェクトをバイト列に変換するという意味があります。

(computing, transitive) To serialize an object into a marshalled state represented by a sequence of bytes that can later be converted back into an object with equivalent properties.

marshal - Wiktionary, the free dictionary

GoのMarshalは、オブジェクトを「JSON文字列」ではなく「JSON文字列のバイト列」に変換します。
そのため、より低レベルな操作である意味を持つ「Marshal」という単語が関数名になっているのだと思われます。

余談ですが、Marshalには「整列させる」、「整理整頓する」という意味があり、そこから「バイト列として整列させる(シリアライズする)」という意味でこの単語が用いられているようです。
Marshalを「整列させる」という意味で用いている例としては、航空機の誘導を行う「マーシャラー」があります。

PythonRuby

Pythonでは、 json.dumps()json.loads() という関数名となっています。
docs.python.org
また、Rubyではdump・loadという単語を関数名としています。
docs.ruby-lang.org

これらのプログラミング言語は、シリアライズ・デシリアライズというニュアンスを表現するのではなく、JSON文字列というテキストデータを出力する・読み込む、というニュアンスを表現しているようです。

Rust

Rustのserde_jsonクレートでは、to_string・from_strという関数名となっています。
docs.rs

JSON文字列化する」、「JSON文字列からオブジェクトを作る」という意味では、JavaScriptと同様に分かりやすい関数名かなと思います。

Java

JavaJSONを扱うライブラリであるgsonでは、toJson・fromJsonという関数名となっています。
www.javadoc.io
gsonも、JavaScriptやRustのserde_jsonクレートと同様に、JSON文字列の入出力に着目した分かりやすい関数名になっているように感じます。

おわりに

シリアライズ・デシリアライズという単語と、「オブジェクトをJSON文字列に変換する」、「JSON文字列からオブジェクトを作る」という操作の対応関係が直感的ではないため、「どっちがどっちだっけ?」となることが多かったので、情報を整理してみました。
または、複数の言語を書いていると、「この言語ではオブジェクトをJSON文字列に変換するのは何ていう関数だっけ?」となることも時々あるので、プログラミング言語毎の関数名もまとめてみました。
言語毎に表現したいニュアンスの違いが関数名に表れているようですね。