ぱんだツールズぱんだツールズ

技術背景

JSONとは — 書き方・整形・検証の基本ガイド

約6分

REST APIのレスポンスをコピペしてJavaScriptに貼り付けたら「SyntaxError: Unexpected token」が出た——そんな経験はないでしょうか。 あるいは設定ファイルのJSONを手で編集したら動かなくなった、末尾カンマを消したら直った、という経験も定番のあるあるです。

JSONはシンプルに見えて、落とし穴がいくつかあります。 この記事ではJSONの構造・文法・JavaScriptでの操作方法・整形と検証のコツを基礎から解説します。

JSONとは

JSON(JavaScript Object Notation)はデータを表現するための軽量なテキスト形式です。 2001年にDouglas Crockfordが提唱し、現在はRFC 8259として標準化されています。 名前にJavaScriptが含まれていますが、言語に依存しないフォーマットであり、Python・Ruby・Go・Javaなどほぼあらゆる言語でパースライブラリが整備されています。

REST APIのレスポンスボディ、設定ファイル(package.json・tsconfig.json)、LocalStorageへのデータ保存、マイクロサービス間のメッセージなど、 現代のWeb開発においてJSONが登場しない場面を探す方が難しいほど普及しています。

XMLに比べて記述量が少なく、人間にも読みやすいことから、2000年代後半に急速に普及しました。

JSONの基本文法

JSONで使えるデータ型は6種類だけです。シンプルな仕様が普及の大きな理由のひとつです。

備考
文字列(string)"hello"必ずダブルクォートで囲む
数値(number)42, 3.14, -1NaN・Infinity・先頭ゼロは使えない
真偽値(boolean)true, false小文字のみ。Trueは無効
nullnull小文字のみ。undefinedは使えない
配列(array)[1, "a", true]異なる型を混在させることもできる
オブジェクト(object){"key": "value"}キーは必ずダブルクォートの文字列

オブジェクトと配列のネスト例

// ユーザー情報の例

{

"name": "山田太郎",

"age": 28,

"isPremium": true,

"address": null,

"tags": ["developer", "designer"],

"profile": {

"bio": "フロントエンドエンジニア",

"website": "https://example.com"

}

}

よくある文法エラーとその直し方

JSONのパースエラーは、ほとんどが次の3種類のどれかに該当します。

1. 末尾カンマ(Trailing Comma)

// NG: 最後の要素の後ろにカンマがある

{

"name": "太郎",

"age": 28, ← ここが問題

}

// OK: 最後のカンマを削除

{

"name": "太郎",

"age": 28

}

JavaScript・TypeScriptのオブジェクトリテラルでは末尾カンマを許容しますが、JSONは許可していません。 コードからJSONファイルを生成する際にやりがちなミスです。

2. シングルクォートの使用

// NG: シングルクォートは無効

{'name': '太郎'}

// OK: ダブルクォートを使う

{"name": "太郎"}

3. コメントの混入

// NG: JSONにコメントは書けない

{

// ユーザー情報

"name": "太郎"

}

// OK: コメントを削除する

{

"name": "太郎"

}

設定ファイルにコメントを書きたい場合は、.jsonc(JSON with Comments)形式を使うか、YAMLへの変更を検討してください。

JavaScriptでのJSON操作

JavaScriptにはJSONを扱う組み込みオブジェクトJSONがあり、2つのメソッドが頻繁に使われます。

JSON.parse() — JSON文字列をオブジェクトに変換

// APIレスポンスのパース例

const jsonStr = '{"name": "太郎", "age": 28}'

const obj = JSON.parse(jsonStr)

// obj.name === "太郎", obj.age === 28

// パースに失敗した場合のエラーハンドリング

try {

const data = JSON.parse(responseText)

// dataを使う処理

} catch (e) {

console.error("JSONのパースに失敗しました", e)

}

JSON.stringify() — オブジェクトをJSON文字列に変換

// 基本形(インデントなし)

JSON.stringify({ name: "太郎", age: 28 })

// → '{"name":"太郎","age":28}'

// 第3引数でインデントを指定(読みやすい整形)

JSON.stringify({ name: "太郎", age: 28 }, null, 2)

// → '{ "name": "太郎", "age": 28 }'

// 第2引数で出力するキーを絞り込む

JSON.stringify({ name: "太郎", age: 28, secret: "xyz" }, ["name", "age"], 2)

// secretキーは出力されない

// ⚠ undefinedと関数はシリアライズ時に省略される

JSON.stringify({ a: undefined, b: () => {}, c: "ok" })

// → '{"c":"ok"}'

JSON整形・検証ツールの使い方

APIレスポンスをブラウザのデベロッパーツールで見ると1行で表示されて読みにくいことがあります。 そういうときはぱんだツールズのJSON整形ツールにペーストするだけで、インデント整形・文法バリデーション・minifyができます。

  • 整形(Prettify) — インデントを付けて可読性の高いJSONに変換。APIレスポンスの確認に
  • 圧縮(Minify) — 空白・改行を除去してファイルサイズを最小化。本番環境のAPIレスポンスに
  • バリデーション — 文法エラーがあれば該当行を指摘。デバッグ時間を大幅に短縮

また、2つのJSONの差分を確認したいときはJSON差分比較ツールが便利です。APIのバージョン間の変更確認や、設定ファイルのビフォーアフター比較に活用できます。

JSONとその他フォーマットの比較

JSONは万能ではありません。用途に応じてCSV・XML・YAMLと使い分けることが大切です。

フォーマット向いている用途苦手な用途
JSONAPIレスポンス、設定ファイル、ネストしたデータコメントが必要な設定、大量の表形式データ
CSV表形式データ(売上・在庫・名簿)、Excelとのやり取りネストした構造、型情報が必要なデータ
XMLドキュメント構造(HTML系)、スキーマ検証が必要な用途シンプルなデータ交換(冗長すぎる)
YAMLCI/CD設定、Docker Compose、Kubernetes、コメント必須の設定ファイルAPIレスポンス、パース速度が重要な場面

CSVとJSONを相互変換したいときはCSV↔JSON変換ツールを使うと、ブラウザ上でワンクリックで変換できます。

まとめ

  • JSONはRFC 8259で標準化された軽量なテキスト形式。APIレスポンスから設定ファイルまで広く使われる
  • 使える型は6種類(文字列・数値・真偽値・null・配列・オブジェクト)。キーはダブルクォート必須
  • よくあるエラーは「末尾カンマ」「シングルクォート」「コメント混入」の3つ
  • JSON.parse()でパース、JSON.stringify(obj, null, 2)で整形出力、エラーはtry-catchで受け取る
  • 表形式データはCSV、コメント必須の設定ファイルはYAMLが向いている
  • 文法エラーが出たらJSON整形ツールに貼ってバリデーションするのが最速

よくある質問

JSONとJavaScriptオブジェクトの違いは何ですか?

JSONはテキスト形式のデータ交換フォーマットであり、JavaScriptオブジェクトはメモリ上のデータ構造です。見た目は似ていますが、JSONにはいくつかの制限があります。①キーは必ずダブルクォートで囲む(JavaScriptオブジェクトではクォートなしも可)、②文字列値はダブルクォートのみ(シングルクォート不可)、③コメントを書けない、④関数・undefined・Date・Symbolなどの型は使えない(シリアライズ時に除外される)。JSON.stringify()でJavaScriptオブジェクトをJSON文字列に変換し、JSON.parse()でJSON文字列をJavaScriptオブジェクトに戻すことができます。

JSONでコメントは書けますか?

JSONの仕様(RFC 8259)では、コメントは定義されていません。//や/* */を書くとパースエラーになります。設定ファイルでコメントを残したい場合は、JSONC(JSON with Comments、VS Codeの設定ファイルなどで採用)やYAMLへの移行を検討してください。JSONの中でコメント代わりに使われるハックとして「_comment」キーに文字列を書く方法がありますが、公式ではなくデータとして扱われます。

JSON.parseでエラーが出たときの対処法は?

SyntaxErrorが出る主な原因は、①末尾カンマ(最後の要素の後ろにカンマがある)、②シングルクォートの使用、③コメントが混入している、④数値の先頭にゼロがある(01234など)、⑤NaNやInfinityが含まれているの5つです。ぱんだツールズの「JSON整形ツール」に貼り付けると、どの行が問題かを即座に確認できます。try-catchで囲んでおくと、エラーが発生してもアプリがクラッシュしません。例: try { const obj = JSON.parse(str) } catch (e) { console.error("JSONのパースに失敗しました", e) }

JSONのファイルサイズを小さくするには?

JSON.stringify(obj)はインデントなしでシリアライズするため、JSON.stringify(obj, null, 2)よりも小さいサイズになります。さらに小さくするには、①不要なキーを削除する、②長いキー名を短縮する(APIレスポンスのminification)、③gzip圧縮を利用する(HTTPの Content-Encoding: gzip)の3つが有効です。gzip圧縮を使うと、繰り返し文字列が多いJSONは圧縮率60〜80%になることもあります。ぱんだツールズのJSON整形ツールは「圧縮(minify)」モードでインデントを除去したコンパクトなJSONを出力できます。

JSONとYAMLどちらを使えばいいですか?

APIレスポンスやデータ交換にはJSON、設定ファイル(CI/CD・Docker Compose・Kubernetesなど)にはYAMLが広く使われています。JSONの利点は、パーサーが軽量で対応言語が多い・パース速度が速いこと。YAMLの利点は、コメントを書ける・インデントで構造を表現でき可読性が高い・複数行文字列が書きやすいことです。人が頻繁に読み書きする設定ファイルはYAML、機械間でやり取りするデータはJSONと使い分けるのが一般的です。

JSONは暗号化されていますか?セキュリティは大丈夫ですか?

JSONはただのテキスト形式であり、暗号化されていません。HTTPで送受信する場合はHTTPS(TLS)で通信路を暗号化する必要があります。JSONの値に機密情報(パスワード・APIキー・個人情報)を含める場合は、サーバー側でアクセス制御を行い、クライアントに必要最小限の情報のみ返すよう設計してください。LocalStorageやクッキーにJSONをそのまま保存する場合も、XSSリスクを考慮した設計が必要です。

日本語(マルチバイト文字)はJSONで使えますか?

はい、使えます。JSONの仕様(RFC 8259)はUnicode文字列を前提としており、日本語・中国語・韓国語などのマルチバイト文字を値に含めることができます。JavaScriptのJSON.stringify()はデフォルトで日本語をそのまま出力しますが、ASCII以外の文字をUnicodeエスケープ(こんにちは)に変換することも可能です(JSON.stringify(obj, null, 2)の第2引数でカスタマイズ可能)。ファイルとして保存する場合は、UTF-8エンコーディングを使うのが標準です。

この記事で紹介したツール