JSONで扱えるデータ型
元々 JavaScript の書式をそのままデータ交換で扱えるようにするということで生み出されたものなので、JavaScript から強い影響を受けている。
null値
bool型
true, false
数値型
JavaScript の数値リテラルと同等
文字列型
JavaScript の文字列リテラルと同等
配列型
[ value1, value2, ... ]
値は JSON で扱える型でなければならない。
区切りのカンマは最後に付いていてはならない。→コーディングスタイル:ケツカンマ問題
オブジェクト型(辞書型)
{ "key1": value1, "key2": value2, ... }
キーはクォートされた文字列でなければならない。
値は JSON で扱える型でなければならない。
区切りのカンマは最後に付いていてはならない。→コーディングスタイル:ケツカンマ問題
数値型の問題
書式的には任意桁数、任意精度が扱えるが、実際には処理系に依存。
オブジェクト型の問題
JavaScript の Object 型に相当するもので、当然 prototype などの衝突問題を持っている。
キーは文字列しか許されない。
undefined 値の問題
undefined 値そのものは渡せず、null に変換される。
オブジェクト型の場合、値が undefined の場合は、キーそのものが JSON データに含まれない。
Date型はそのままでは転送できない。文字列化されてしまう。
https://gyazo.com/85262f8604941111bba4014ee75036c0
Map型やSet型はそのままでは転送できない。
https://gyazo.com/b0325136e3e67ce1a32d7a9ec98cc941
一度配列化することで JSON に入れられる。戻す時には配列型から Map, Set を作る。
ただし、内容物が JSON で扱える型でなければならない。
code:js
const inMap = new Map();
inMap.set("k1", "v1");
inMap.set("k2", "v2");
const jsonStr = JSON.stringify(...inMap);
const arr = JSON.parse(jsonStr);
const outMap = new Map(arr);
JSON.stringify, JSON.parse に追加で文字列化と解析の関数を渡すことができる。
https://stackoverflow.com/questions/29085197/how-do-you-json-stringify-an-es6-map