LoginSignup
8
8

More than 3 years have passed since last update.

本当のJSONをぼくは知らなかった

Last updated at Posted at 2019-09-03

こんにちわ。
ゴリラです。

みなさんJSONを知っていますか?
JSONはAPI通信、つまりサービス間のデータ転送によく使われるデータフォーマットの1つです。

自分もよく使っているので、完全にJSONを理解したつもりでしたが、理解していないことがわかったので、
理解するためにこの記事を書きました。

はじめに

jsで次のコードを実行するとどうなるのでしょうか?
わかる方はこの記事を読んでもためにならないので、ブラウザバックしましょう。
分からない方は引き続き読み進めてください。

JSON.parse('"gorilla"');

JSONの仕様

JSONの仕様はRFC 8259で標準化されているので、こちらの資料を読めばわかります。
英語読める方はこの記事よりもRFC読んだほうが良いかと思います。

JSONの値の種類

JSONは次の値を使用することができます。

  • 文字列
  • 数値
  • オブジェクト
  • 配列
  • リテラル(false/true/null)

一般的によく見る形は次かと思います。

{
  "name": "gorilla",
  "is_human": false,
  "language": [
    "Go",
    "PHP",
    "Java",
    "JavaScript"
  ]
}

これはいわゆるオブジェクトと呼ばれていて、{} で囲うルールになっています。
オブジェクトの中にはオブジェクトや配列などを入れることもできます。

ぼくはこれをJSONの形と勘違いしていました。
しかし、先程説明したとおり、JSONで使用できる値はオブジェクトの他に、数値や文字列などがあります。
つまり、次のようなコードもちゃんとパースできるJSONです。

JSON.parse('1')
JSON.parse('false')
JSON.parse('true')
JSON.parse('null')
JSON.parse('"gorilla"')

これを知った時、驚きました。
「JSONなめてました。すいません。」という感じでした。

値の種類ごとにいくつかルールがありますが、詳細はRFCを見たほうが良いので、本記事ではすこし抜粋して解説します。

なお、説明で使用したパーサはnode.js v12.6.0のものになります。

数値

数値は次の値を使用することができます。

  • 整数
  • 浮動小数点
  • 指数

整数と浮動小数点はもちろん、
指数もJSON.parse('1.125e+1')のように、
パーサに指数の数値を渡すとちゃんと11.25 に展開されます。
指数はEでもeでも動きます。

また、JSON.parse('1e+1000')のように、数値が大きいすぎた場合はInfinityになります。

文字列

通常の文字(a~zなど)意外にも、Unicode、サロゲートペアを使用することもできます。
サロゲート…、うっ頭痛が…

// Unicode
> JSON.parse('"\u00D2"')
'Ò'

// サロゲートペア
> JSON.parse('"\uD834\uDD1E"')
'𝄞'

リテラル

リテラルは小文字でなければ行けないので、JSON.Parse('TRUE')などはパースエラーになります。

最後に

雑にまとめてみましたが、JSONは意外とルールが細かったのがわかりました。
普段なにげに使っているけど、実はよくわかっていなかったことが結構あったりするので、
JSONに関わらず、RFCちゃんと読んだほうが良いなと思いました。

みなさんも時間あるときRFCをよんでみてください。

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8