JSONとは?CSV・XML・YAMLとの違いやJavaScriptとの関係
JSONは、エンジニアであれば日々耳にするワードです。
正式名称はJavaScript Object Notationですが、JSONがどのような形式で、JavaScriptとどう関係しているのかまで説明できるでしょうか。
この記事では、JSONの基本構造から、CSV・XML・YAMLとの違い、JavaScriptとの関係までを整理していきます。
JSONとは
複数のプログラムでデータを扱うには、名前や数値をどのような形で並べるかを決める必要があります。
例えば、1冊の本に関する情報を次のように表すとします。
{
"title": "JSON入門",
"price": 2200,
"available": true,
"tags": ["Web", "データ形式"]
}
このように、構造を持つデータをテキストで表すための記法がJSONです。
項目名と値の対応がそのまま書かれているため、整形されたJSONであれば、人間もデータの内容や構造を追えます。同時に、書き方が仕様として決められているため、プログラムもJSONを解析してデータとして扱えます。
正式名称は、JavaScript Object Notationです。
JSONの仕様であるRFC 8259では、JSONを軽量かつテキストベースで、特定のプログラミング言語に依存しないデータ交換形式と定義しています。
JSONはテキストなので、ファイルに保存できます。
ただし、JSONは.jsonファイルだけを指す言葉ではありません。
プログラムが生成した文字列や、通信で送受信するデータも、JSONの構文に従っていればJSONです。
JSONの基本構造
JSONでは、主にオブジェクトと配列を組み合わせてデータの構造を表します。
オブジェクト
オブジェクトは、名前と値の組をまとめたものです。
全体を{}で囲み、それぞれの名前と値を:で区切ります。
{
"title": "JSON入門",
"price": 2200
}
"title"と"price"が名前です。
JSONでは、この名前を必ずダブルクォートで囲みます。
"JSON入門"と2200が、それぞれの名前に対応する値です。
複数の組を書く場合は、組と組の間をカンマで区切ります。
配列
配列は、複数の値を順番に並べたものです。
全体を[]で囲み、値と値の間をカンマで区切ります。
["Web", "データ形式", "初心者"]
配列の中には、文字列だけでなくオブジェクトも入れられます。
{
"books": [
{
"title": "JSON入門",
"price": 2200
},
{
"title": "XML入門",
"price": 2400
}
]
}
この例では、booksという名前に配列が対応し、その配列の中に2つのオブジェクトが入っています。
JSONは、オブジェクトと配列を入れ子にすることで階層を表します。
JSONで使える値
JSONで扱える値は、次の6種類です。
-
文字列:
"JSON入門" -
数値:
2200 -
真偽値:
trueまたはfalse -
null:
null -
オブジェクト:
{} -
配列:
[]
文字列はダブルクォートで囲みます。
{
"title": "JSON入門"
}
数値はダブルクォートで囲みません。
{
"price": 2200
}
"2200"と書いた場合は、数値ではなく文字列です。
真偽値とnullもダブルクォートで囲みません。
{
"available": true,
"discount": null
}
nullは、値が存在しないことを表すために使われます。
ただし、nullをどのような意味で使うかはJSONの仕様だけでは決まりません。
「未入力」「不明」「該当なし」など、具体的な意味はデータを扱う側で決めます。
JSONとして正しいことと、データとして正しいこと
次の2つは、どちらもJSONとして正しい記述です。
{
"price": 2200
}
{
"price": "二千二百円"
}
しかし、価格を数値として計算するプログラムが後者を受け取ると、そのままでは計算できません。
JSONの仕様が決めているのは、文字列や数値をどのような構文で表すかです。
priceに数値を入れるのか、文字列を入れるのかまでは決めていません。
項目の名前、値の種類、必須項目などは、JSONを作る側と読む側で別に決める必要があります。
JSONで間違えやすい書き方
次の記述は、JSONとして正しくありません。
{
title: "JSON入門",
"price": 2200,
}
titleをダブルクォートで囲んでいないことと、最後の値の後ろにカンマがあることが理由です。
正しくは次のように書きます。
{
"title": "JSON入門",
"price": 2200
}
JSONにはコメントも書けません。
{
"price": 2200 // 税込み価格
}
この記述も、JSONとしては正しくありません。
日付、関数、バイナリデータなどを直接表す専用の型もありません。
日付をJSONで扱う場合は、文字列として表し、その文字列の形式をデータの送り手と受け手で決めます。
{
"publishedAt": "2026-08-02"
}
JavaScriptとの関係
JSONの名前にJavaScriptが入っているのは、JavaScriptでオブジェクトを書く記法をもとに作られたためです。
JavaScriptでは、先ほどの本の情報を次のように書けます。
const book = {
title: "JSON入門",
price: 2200,
available: true,
tags: ["Web", "データ形式"]
};
JSONにすると次のようになります。
{
"title": "JSON入門",
"price": 2200,
"available": true,
"tags": ["Web", "データ形式"]
}
見た目は似ていますが、JavaScriptのオブジェクトとJSONは別のものです。
JavaScriptのオブジェクトは、プログラムの実行中にメモリ上で扱う値です。
JSONは、そのようなデータをテキストで表したものです。
書き方にも違いがあります。
| 項目 | JavaScriptのオブジェクト | JSON |
|---|---|---|
| 名前 | 条件を満たせばダブルクォートを省略できる | ダブルクォートで囲む |
| 関数 | 値として持てる | 持てない |
undefined |
値として扱える | JSONの値にはない |
| コメント | ソースコード内に書ける | 書けない |
| 末尾のカンマ | 書ける | 書けない |
例えば、次のJavaScriptオブジェクトには関数が含まれています。
const book = {
title: "JSON入門",
getLabel() {
return this.title;
}
};
関数はデータを処理するためのプログラムなので、JSONの値としては表せません。
JSONがJavaScriptに由来することは、「JSONがJavaScript専用である」ことを意味しません。
現在のJSONは独立した仕様として定義され、Python、Java、Goなどの言語でも扱えます。
JavaScriptでJSONを変換する
JavaScriptには、JSONとオブジェクトを相互に変換する機能があります。
JSON形式の文字列をJavaScriptの値へ変換するのがJSON.parse()です。
const jsonText = '{"title":"JSON入門","price":2200}';
const book = JSON.parse(jsonText);
console.log(book.title);
// JSON入門
この例のjsonTextは文字列です。
JSON.parse()を実行すると、JavaScriptのオブジェクトとしてプロパティを参照できるようになります。
反対に、JavaScriptの値をJSON形式の文字列へ変換するのがJSON.stringify()です。
const book = {
title: "JSON入門",
price: 2200
};
const jsonText = JSON.stringify(book);
console.log(jsonText);
// {"title":"JSON入門","price":2200}
JSON.parse()とJSON.stringify()の関係は次のとおりです。
JSON形式の文字列
↓ JSON.parse()
JavaScriptの値
↓ JSON.stringify()
JSON形式の文字列
CSV・XML・YAMLとの違い
JSON以外にも、テキストでデータを表す形式があります。
どの形式が優れているかではなく、データの形と処理する方法によって使い分けられます。
同じ本の情報を、JSON、CSV、XML、YAMLで書き比べます。
JSON
{
"title": "JSON入門",
"price": 2200,
"tags": ["Web", "データ形式"]
}
JSONは、オブジェクトと配列を使って階層を表します。
値が文字列なのか数値なのかも、構文から区別できます。
CSV
title,price,tags
JSON入門,2200,"Web,データ形式"
CSVは、データを行と列で表します。
表計算ソフトで扱う一覧のように、同じ項目を持つデータが並ぶ場合に使いやすい形式です。
一方で、配列や入れ子構造をどのように表すかはCSVの基本構造に含まれません。
この例では、2つのタグをひとつのセルにまとめています。
XML
<book>
<title>JSON入門</title>
<price>2200</price>
<tags>
<tag>Web</tag>
<tag>データ形式</tag>
</tags>
</book>
XMLは、タグを使ってデータの構造を表します。
要素、属性、名前空間など、JSONとは異なる表現を持っています。
開始タグと終了タグを書くため、同じデータをJSONで書く場合より記述量が増えることがあります。
YAML
title: JSON入門
price: 2200
tags:
- Web
- データ形式
YAMLは、インデントを使って階層を表します。
JSONより記号が少なく、コメントも書けます。
一方で、空白の位置が構造に影響するため、インデントを崩すと別のデータとして解釈されたり、構文エラーになったりします。
4つの形式を整理する
それぞれの違いを、データの表し方で整理します。
| 形式 | データの表し方 | 補足 |
|---|---|---|
| JSON | オブジェクトと配列 | 値の種類と階層を表せる |
| CSV | 行と列 | 表形式のデータを簡潔に表せる |
| XML | タグ、属性 | 文書を含む複雑な構造も表現できる |
| YAML | インデント、配列、名前と値 | コメントを書けるが、空白が構造に影響する |
JSONは、名前と値の組、値の並び、その入れ子を表したい場合に利用できます。
ただし、JSONを使うかどうかは用途の名前だけでは決まりません。
APIでもJSON以外の形式を使えますし、設定ファイルにもJSON、YAML、TOMLなど複数の選択肢があります。
扱うデータの構造、既存の仕様、利用するライブラリ、人が直接編集する頻度などから形式を選びます。
リレーショナルデータベースがJSONを扱う理由
JSONはデータの表現形式であり、リレーショナルデータベースはデータを保存、検索、更新するための仕組みです。
役割は異なりますが、Oracle DatabaseやPostgreSQLなどのリレーショナルデータベースはJSONを扱う機能を備えています。
リレーショナルデータベースでは、あらかじめ決めた列にデータを保存します。
例えば、商品を管理するテーブルには、次のような列を定義できます。
| id | name | price |
|---|---|---|
| 1 | Tシャツ | 3000 |
| 2 | ノートPC | 120000 |
id、name、priceは、どの商品にも共通する項目です。
一方で、商品ごとに異なる属性もあります。
Tシャツには色やサイズがあり、ノートPCにはメモリやストレージがあります。
これらをすべて通常の列として定義すると、扱う商品の種類が増えるたびに列の追加が必要になる場合があります。
そこで、共通する項目は通常の列に置き、商品ごとに異なる属性をJSON列へ保存する構成が使えます。
| id | name | price | attributes |
|---|---|---|---|
| 1 | Tシャツ | 3000 | {"color":"blue","size":"M"} |
| 2 | ノートPC | 120000 | {"memory":"16GB","storage":"512GB"} |
この構成では、価格のように検索や集計で頻繁に使う項目を通常の列として管理できます。
一方、商品によって構造が異なるattributesは、JSONの入れ子構造を保ったまま保存できます。
JSONを単なる文字列として保存するだけでは、正しいJSONかどうかの検証や、JSON内部の値を使った検索に追加の処理が必要です。
データベースがJSON専用のデータ型を持つことで、保存時の検証、JSON内部の検索、値の更新、インデックスの作成などをデータベース側で行えます。
PostgreSQLには、入力されたJSONテキストを保持するjson型と、解析したバイナリ形式で保存するjsonb型があります。
jsonb型はJSON内部の検索やインデックスに対応しており、JSONをデータベースの値として処理できます。
Oracle DatabaseにもJSON型があり、通常の列とJSON列を同じテーブルに置けます。
Oracle Databaseは、リレーショナルテーブルに保存したデータをJSONドキュメントとして扱うJSON Relational Duality Viewも提供しています。
これにより、データベース内部では表と列の関係を保ちながら、アプリケーション側では同じデータをJSONとして読み書きできます。
リレーショナルデータベースがJSONを扱えるのは、リレーショナルモデルをJSONで置き換えるためではありません。
列と型が決まった表形式のデータと、項目の追加や入れ子を含むJSONを、同じデータベースの中で組み合わせるためです。
JSONを読むときの確認点
JSONを見たときは、外側の記号から構造を追えます。
{}で始まっていれば、名前と値の組を持つオブジェクトです。
[]で始まっていれば、複数の値を持つ配列です。
値の中に{}や[]があれば、さらに内側へ構造が続いています。
{
"title": "JSON入門",
"authors": [
{
"name": "山田 太郎"
},
{
"name": "佐藤 花子"
}
]
}
このJSONは、外側が本を表すオブジェクトです。
authorsの値は配列で、その配列の各要素が著者を表すオブジェクトになっています。
JSONは、かっこの種類、名前と値の対応、入れ子の順に見ると構造を読み取れます。
まとめ
JSONは、構造を持つデータをテキストで表すための記法です。
JavaScriptのオブジェクト記法をもとにしていますが、現在は特定のプログラミング言語に依存しない形式として定義されています。
CSVは行と列、XMLはタグ、YAMLはインデントを中心にデータを表します。
JSONはその中で、オブジェクトと配列を組み合わせてデータの階層を表す形式です。
参考
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format
- ECMA-404: The JSON Data Interchange Syntax
- MDN Web Docs: JSON
- RFC 4180: Common Format and MIME Type for CSV Files
- XML 1.0 Specification
- YAML Specification
- PostgreSQL: JSON Types
- Oracle Database: Tables With JSON Columns
- Oracle Database: JSON-Relational Duality
- JSONとは?初心者向けに基本構造と使い方をわかりやすく解説
最後の記事を参考にさせていただきました。ありがとうございました。