JSONの型について

## アジェンダ

JSON（JavaScript Object Notation）は、データをシンプルで読みやすい形式で表現するためのフォーマットです。ウェブアプリケーションやAPI間でデータをやり取りする際によく使われます。
ここでは、JSONで使用できるデータ型について簡単にまとめます。

## JSONの基本構造

JSONのデータは、以下の2つの構造を基本としており、データ型は6つあります。

- **オブジェクト**: `{}` で囲まれたキーと値のペアの集合。キーは文字列、値は任意の型です。
- **配列**: `[]` で囲まれたデータのリスト。値は任意の型です。

例:
```json
{
  "name": "John",
  "age": 30,
  "isStudent": false,
  "courses": ["Math", "Science"],
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}
```

## JSONで使用できるデータ型

JSONで扱えるデータ型は、JavaScriptに基づいています。6つのデータ型を紹介します。

### 文字列 (String)

文字列は、ダブルクォーテーション (`"`) で囲まれたテキストです。JSONでは、キーや値として文字列を使用できます。

例:
```json
{
  "message": "Hello, World!"
}
```

注意点: 文字列にはシングルクォーテーションは使用できません。

### 数値 (Number)

数値は整数や小数の形で表現されます。JSONでは、整数 (`42`) や浮動小数点数 (`3.14`) を使用できます。

例:
```json
{
  "age": 25,
  "height": 1.75
}
```

注意点: JSONではNaNやInfinityなどの特別な値はサポートされていません。

### 真偽値 (Boolean)

真偽値は、`true` または `false` で表現されます。条件やフラグなどに使用します。

例:
```json
{
  "isAdmin": true,
  "isVerified": false
}
```

### 配列 (Array)

配列は、複数の値をリストとして扱う際に使用します。配列内の値は、文字列や数値など任意の型を持つことができます。

例:
```json
{
  "colors": ["red", "green", "blue"],
  "scores": [90, 85, 78]
}
```

注意点: 配列内の型は混在させても構いませんが、意味のある使い方を心がけるべきです。

### オブジェクト (Object)

オブジェクトは、キーと値のペアの集合です。キーは必ず文字列で、値は任意の型を取ります。オブジェクトを使うと、関連するデータをまとめて扱うことができます。

例:
```json
{
  "user": {
    "name": "Alice",
    "email": "alice@example.com"
  }
}
```

### null

`null` は、空または不明な値を示すために使用します。未定義の値や、意図的に値がないことを表すのに便利です。

例:
```json
{
  "middleName": null
}
```

## JSONで使用できないデータ型

JSONは柔軟で多くのデータ型を扱えますが、JavaScriptのすべての型をサポートしているわけではありません。特定のデータ型はJSONの形式に適さないため、注意が必要です。

### 関数 (Function)

JSONでは、関数を値として使用することはできません。JavaScriptオブジェクト内では関数を持つことができますが、JSONに変換する際には無視されます。

例:
```javascript
const obj = {
  name: "John",
  greet: function() {
    return "Hello!";
  }
};

const json = JSON.stringify(obj);  // {"name":"John"} （関数は含まれない）
```

### 日付 (Date)

日付オブジェクトは、JSONの形式には対応していません。`JSON.stringify()`を使用して日付をJSONに変換すると、日付は自動的に文字列としてシリアライズされます。

例:
```javascript
const obj = {
  date: new Date()
};

const json = JSON.stringify(obj);  // {"date":"2024-09-06T10:00:00.000Z"} （ISO 8601形式の文字列に変換）
```

日付を扱う場合、事前に適切な形式に変換する必要があります。

### undefined

JSONは `undefined` を値として扱いません。オブジェクト内に `undefined` を含むプロパティがあった場合、それは `JSON.stringify()` で無視されます。

例:
```javascript
const obj = {
  name: "John",
  age: undefined
};

const json = JSON.stringify(obj);  // {"name":"John"} （undefinedは無視される）
```

もし `null` のように意図的に「値が存在しない」ことを表したい場合は、`null` を使う必要があります。


## JSONの型制約と注意点

- **キーの型**: JSONオブジェクトのキーは、常に文字列でなければなりません。
- **コメントの禁止**: JSONでは、JavaScriptとは異なり、コメントを書くことが許可されていません。
- **データ型の一致**: 値が適切な型かどうかを確認することが重要です。例えば、APIで送信するデータが予期せぬ型の場合、エラーが発生することがあります。

## JSONとTypeScriptでの型定義

TypeScriptでは、JSONの型を厳密に定義できます。たとえば、次のようにJSONオブジェクトの型を定義することができます。

```typescript
type User = {
  name: string;
  age: number;
  isStudent: boolean;
  courses: string[];
  address: {
    city: string;
    zip: string;
  };
};

const user: User = {
  name: "John",
  age: 30,
  isStudent: false,
  courses: ["Math", "Science"],
  address: {
    city: "New York",
    zip: "10001"
  }
};
```

これにより、JSONの構造と型を厳密に管理でき、予期せぬエラーを防ぐことができます。

## まとめ

JSONは、シンプルかつ柔軟なデータ形式であり、さまざまな用途で使用されます。文字列、数値、真偽値、配列、オブジェクト、nullの6つの基本型を理解することで、データを効果的に扱えるようになります。また、TypeScriptを活用することで、JSONデータに対して厳密な型定義を行うことができ、より安全で保守性の高いコードを書くことができます。

## 参考
- [8.14. JSONデータ型](https://www.postgresql.jp/docs/11/datatype-json.html)