JSON(JavaScript Object Notation)は、JavaScriptオブジェクト構文に基づくテキストベースのデータ交換形式です。REST APIや設定ファイルからデータベースやモバイルアプリケーションでのデータ保存まで、あらゆる場所で使用されています。JSON公式サイトによると、この形式はプログラミング言語に依存せず、ほぼすべての現代プラットフォームでサポートされています。JSONは、クライアントとサーバー間のデータ転送におけるデファクトスタンダードになっています。
重要ポイント
JSONは、構造化データを表現するためのテキスト形式で、JavaScript構文に基づいています。JavaScriptに由来するものの、この形式は完全に言語に依存しません — すべての主要なプログラミング言語にパーサーとシリアライザーが存在します。
JSONの歴史は2000年代初頭に始まり、Douglas Crockfordがデータ交換のためにJavaScript構文のサブセットを抽出しました。2013年にこの形式はECMA-404として標準化され、その後ISO/IEC 21778:2017として標準化されました。名称はJavaScript Object Notationの略です。
JSONの主な利点は、そのミニマルな構文です。データを記述するために使用される型は、文字列、数値、ブール値、null、配列、オブジェクトのわずか6つです。これは、アプリケーションで使用されるあらゆるデータ構造を表現するのに十分です。
JSONの構文は非常にシンプルです。データはキーと値のペアで表現され、キーは二重引用符で囲まれた文字列、値は6つの基本型のいずれかです。オブジェクトは中括弧で囲まれ、配列は角括弧で囲まれます。文字列は二重引用符を使用する必要があり、一重引用符は許可されていません。
JSONの数値は、整数または浮動小数点、正または負、指数表記が可能です。ブール値はtrueとfalseのリテラルで表現され、値の欠如はnullで表現されます。配列には、ネストされた配列やオブジェクトを含む、任意の型の値の順序付きセットが含まれます。
{
"name": "JSON",
"type": "text",
"version": 2024,
"flexible": true,
"extensions": null,
"languages": [
"JavaScript",
"Python",
"Java"
],
"nested": {
"info": "ネストされたサポート"
}
}
| 型 | 例 | 説明 |
|---|---|---|
| 文字列 | “テキスト” |
二重引用符で囲み、エスケープシーケンス使用可能 |
| 数値 | 42 |
整数、浮動小数点、指数 |
| ブール値 | true |
trueまたはfalse — 引用符なし |
| null | null |
値の欠如 |
| オブジェクト | {} |
キーと値のペアの順序なしセット |
| 配列 | [] |
値の順序付きリスト |
JSONは、モバイルおよびWeb開発におけるREST APIの主要なデータ交換形式です。サーバーはレスポンスボディでJSONを送信し、クライアントはリクエストボディで送信します。JSONの標準Content-Typeヘッダーはapplication/jsonです。
現代のREST APIは、単純なリストからエンティティ間の関係を持つ複雑なネスト構造まで、あらゆるタイプのデータを送信するためにJSONを使用します。クライアントライブラリ(JavaScriptのAxiosやAndroidのRetrofitなど)は、JSONを自動的にシリアライズおよびデシリアライズし、開発者を手動解析から解放します。
REST APIにおけるJSONの重要な利点は、クエリパラメータによる部分的なデータ転送(部分レスポンス)の可能性と、サーバーへの追加リクエストなしでのネストされたリソースのサポートです。
JSON解析は、モバイルプラットフォームでは組み込みツールを使用して実行されます。AndroidはGoogleのGsonまたはSquareのMoshiを使用し、iOSはJSONDecoderと共にCodableプロトコルを使用します。各プラットフォームは、JSONをネイティブオブジェクトに変換するための便利なツールを提供しています。
Androidでは、GsonまたはMoshiを使用するアプローチが一般的です。@SerializedNameアノテーションを持つデータクラスを定義し、デシリアライゼーションにfromJsonを呼び出すだけです。ライブラリは自動的にJSONフィールド名をクラスのプロパティにマッピングします。
import com.google.gson.Gson
import com.google.gson.annotations.SerializedName
data class User(
@SerializedName("id") val id: Int,
@SerializedName("name") val name: String,
@SerializedName("email") val email: String
)
fun parseJson(jsonString: String): User {
val gson = Gson()
return gson.fromJson(jsonString, User::class.java)
}
iOSでは、JSONDecoderと共に組み込みのCodableプロトコルが使用されます。データ構造はCodableに準拠したstructとして宣言され、その後JSONは1行で解析されます。JSONEncoderは逆シリアライゼーションを実行します — オブジェクトをJSONに変換してサーバーに送信します。
import Foundation
struct User: Codable {
let id: Int
let name: String
let email: String
}
func parseJSON(from data: Data) throws -> User {
let decoder = JSONDecoder()
return try decoder.decode(User.self, from: data)
}
JSONとXMLは、構造化データを送信するための2つの主要な形式です。JSONはシンプルさとパフォーマンスで優れ、XMLは厳格さと検証で優れています。どちらを選ぶかはプロジェクトの要件に依存します。REST APIではJSONがより頻繁に使用され、スキーマを持つ複雑なドキュメントではXMLが使用されます。
XMLはすべての要素にクロージングタグが必要であり、JSONと比較してデータサイズが2〜3倍増加します。同時にXMLは、名前空間、XSDスキーマ、属性、XSLT変換をサポートしており、ドキュメント管理やエンタープライズシステム統合のタスクにおいてより強力です。
| 特性 | JSON | XML |
|---|---|---|
| 構文 | ミニマル、キーと値 | タグベース、開始タグと終了タグ |
| データサイズ | コンパクト | JSONの2〜3倍 |
| データ型 | 6つの基本型 | テキストのみ、スキーマ経由で型指定 |
| 検証 | 組み込みなし、JSON Schema経由 | XSD — 厳格で成熟 |
| 名前空間 | なし | 完全な名前空間サポート |
| 解析速度 | 高速 | 複雑さのため低速 |
例は、モバイル開発におけるJSONの典型的な操作を示しています:APIレスポンスの解析、送信用JSONの作成、ネストされた構造の処理。これらのパターンを理解することは、モバイルアプリケーション開発者にとって不可欠です。
JavaScriptでは、JSON.stringifyがオブジェクトをJSON文字列に変換します。第2引数は、選択的シリアライゼーションのためのキーの配列、または置換関数にすることができます。第3引数は、フォーマット用のインデントを設定します。
interface Order {
id: string;
items: OrderItem[];
total: number;
createdAt: string;
}
const order: Order = {
id: 'ord_001',
items: [{ product: 'phone', quantity: 2 }],
total: 1599.98,
createdAt: '2026-07-03T10:00:00Z'
};
const jsonString = JSON.stringify(order, null, 2);
Moshiライブラリを使用したKotlinでは、ネストされたJSONオブジェクトはネストされたデータクラスを通じて処理されます。@Jsonアノテーションは、クラスのプロパティ名と異なる場合にJSONフィールド名を指定します。配列は要素型を持つListとして表現されます。
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
data class ApiResponse(
val status: String,
val data: List<Product>,
val pagination: Pagination
)
data class Product(
val id: Int,
val title: String,
val price: Double
)
data class Pagination(
val page: Int,
val total: Int
)
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
JSON Schemaは、XMLのXSDと同様に、JSONドキュメントの構造を記述するための言語です。JSON Schemaを使用すると、必須フィールド、データ型、値の範囲、文字列パターン、ネストされた構造を指定できます。スキーマ検証は、アプリケーションで処理される前にデータエラーを検出します。
JSON Schemaは、REST APIを文書化するためのOpenAPI(Swagger)、入力データ検証フォーム、テストで広く使用されています。スキーマファイル自体がJSONドキュメントであるため、標準のJSONパーサーで読み取ることができます。すべての主要なプログラミング言語にオンラインバリデーターとライブラリが存在します。
モバイル開発では、JSON Schemaはテスト中のサーバーレスポンスの検証や設定ファイルのチェックに使用されます。Androidのnetwork-validatorやjson-schema-validatorのようなライブラリは、検証を開発プロセスに直接組み込み、初期段階でのエラーを防止することを可能にします。
よくある質問
JSONは6つの型をサポートしています:文字列(二重引用符で囲む)、数値(整数および浮動小数点)、ブール値(true/false)、null、オブジェクト({}内のキーと値のペア)、配列([]内の値のリスト)。アプリケーションのあらゆるデータ構造に十分です。
いいえ、JSON標準はコメントをサポートしていません。コメントが必要な場合は、JSON5(拡張JSON)を使用するか、説明フィールドを追加してください(例:“_comment”: “説明”)。VS Codeなどの一部のツールは、設定JSONファイル内のコメントをサポートしていますが、これは非標準の拡張です。
JSONBは、PostgreSQLにおけるJSONのバイナリ保存形式です。テキストJSONとは異なり、JSONBは処理が高速で、インデックス作成(GINインデックス)をサポートし、キーの一意性を保証します。ただし、JSONBはメタデータが追加されるため、ディスク上のスペースをより多く占有します。
簡単な確認にはJSONLint(jsonlint.com)、try-catch付きのJavaScriptの組み込みJSON.parse()、またはIDEプラグインを使用してください。検証には、正しい引用符、括弧の閉じ方、型の適合性の確認が含まれます。複雑なスキーマについては、JSON Schema Validatorを使用してください。
JSON仕様には制限はありません。実際には、サイズはデバイスのメモリとパーサーの能力によって制限されます。モバイルアプリケーションでは、1回のレスポンスで1〜2 MBを超えないことが推奨され、大規模なデータにはページネーションまたはストリーミングを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。