CreaTools LogoCreaTools
JSON Formatter

JavaScriptオブジェクトとJSONの違い|変換で消えるもの一覧

2025-01-03

30秒結論

JSONは「保存・通信用の文字列」、JSオブジェクトは「実行用のデータ構造」。

// JavaScriptオブジェクト(メモリ上のデータ)
const obj = { name: "test", count: 1 };

// JSON(文字列)
const json = '{"name": "test", "count": 1}';

見た目は似ているが、JSONはJavaScriptで動作しない。文法が違う。


一目でわかる差分表

項目JS オブジェクトJSON
本質オブジェクト文字列
キーのクォート省略可必須
文字列のクォートシングル可ダブルのみ
末尾カンマOKエラー
コメントOKエラー
関数OK不可
undefinedOK不可

変換方法

// オブジェクト → JSON文字列
const json = JSON.stringify(obj);

// JSON文字列 → オブジェクト
const obj = JSON.parse(json);

stringify時に消えるもの

const obj = {
  name: "test",
  fn: () => {},       // 関数 → 消える
  undef: undefined,   // undefined → 消える
  sym: Symbol("x"),   // Symbol → 消える
};

JSON.stringify(obj);
// → '{"name":"test"}'
結果
関数消える
undefined消える
Symbol消える
NaNnull になる
Infinitynull になる
Date文字列になる

よくあるエラーパターン

循環参照

const obj = { name: "test" };
obj.self = obj;  // 自分自身を参照

JSON.stringify(obj);
// → TypeError: Converting circular structure to JSON

オブジェクトが自分自身を参照しているとJSON化できない。

Dateが文字列になる

const obj = { date: new Date("2025-01-01") };

JSON.stringify(obj);
// → '{"date":"2025-01-01T00:00:00.000Z"}'

JSON.parse('{"date":"2025-01-01T00:00:00.000Z"}');
// → { date: "2025-01-01T00:00:00.000Z" }  ← 文字列のまま

Dateとして扱いたいなら手動で変換が必要。

const data = JSON.parse(json);
data.date = new Date(data.date);

「コンソールに貼ったら動いた」は信用するな

ブラウザのコンソールに「JSONっぽいもの」を貼ると動くことがある。

// これはJavaScriptオブジェクトリテラル
{ name: "test" }

これはJavaScriptとして評価されているだけ。JSONとして有効とは限らない

確認したいなら JSON Formatter に貼って検証する。


API通信での使い方

// リクエスト:オブジェクト → JSON文字列
fetch('/api', {
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(data),
});

// レスポンス:JSON文字列 → オブジェクト
const data = await response.json();

送信時は stringify、受信時は .json() でパース。


まとめ

ポイント内容
JSON保存・通信用の文字列
JSオブジェクト実行用のデータ構造
変換で消えるもの関数、undefined、Symbol
変換で変わるものDate(文字列化)、NaN/Infinity(null化)
変換できないもの循環参照

👉 「これJSONとして有効?」と思ったら JSON Formatter で検証