コンテンツにスキップ

JSON:JavaScript Object Notation@データ記述型言語

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. JSONとは

異なる言語間やサーバー間で変換できるデータ記述型言語である。

元はJavaScriptから生まれた。


02. 文法

キー名

JSONのキー名はローワーキャメルケースにする。

{"propertyName": "propertyValue"}


配列

{"account": 200, "fruit": ["banana", "apple"]}


オブジェクト

{"account": 200, "fruit": {"banana": "BANANA", "apple": "APPLE"}}


コメントアウト

JSONにはコメントアウトを定義できない。

代わりに、_commentキーを定義する。

アプリ側で、JSONの_commentキーを無視するような処理を実装する。

{
  "_comment": "金額",
  "account": 200,
  "_comment": "フルーツ",
  "fruit": {
    "banana": "BANANA",
    "apple": "APPLE"
  }
}


03. 相互パース (シリアライズ + デシリアライズ)

バックエンドとフロントエンド間

フロントエンドにJavaScript、バックエンドにPHPを使用しているとする。

データ送信のためにオブジェクト (JS型、PHP型) をJSONに変換する処理はシリアライズである。

一方で、送信のためにJSONをオブジェクト (JS型、PHP型) に変換する処理はデシリアライズである。

シリアライズとデシリアライズ


バックエンドとDB間

バックエンドにPHPを使用しているとする。

データ格納のためにオブジェクト (PHP型) をDBレコードに変換する処理はシリアライズである。

一方で、データ取得のためにJSONをオブジェクト (PHP型) に変換する処理はデシリアライズである。


04. オブジェクトデータ

JSON

▼ 定義方法

キーを、シングルクオーテーションではなく、クオーテーションで囲う必要がある。

*実装例*

const json = {
  account: 200,
  fruit: ["banana", "apple"],
};

▼ キーと値の変更方法

*実装例*

// どんなデータを含むJSONなのかわかりやすい方法
const json = {
  age: null,
  name: null,
  tel: null,
};

json.age = 30;
json.name = "taro";
json.tel = "090-0123-4567";

*実装例*

const json = {};

// areaというキーの値を追加
json.prefecture = "Tokyo";

// もしくは、
json["prefecture"] = "Tokyo";

// 以下は。undefined になる。二段階の定義はできない。
//// json.prefecture.area = "Shibuya";

*実装例*

const json = {
  age: 30,
  name: "taro",
  tel: "090-0123-4567",
};

// areaというキーの値を追加
json.prefecture = "Tokyo";

// もしくは、
json["prefecture"] = "Tokyo";

▼ キーの並び順

キーはアルファベット順に並べると良い。

以下のサイトで並び替えられる。


フロントエンドの場合

▼ 定義方法

キーはクオーテーションで囲う必要が無い。

*実装例*

const object = {
  account: 200,
  fruit: ["banana", "apple"],
};
class Foo {
  constructor(fruit, account) {
    this.fruit = fruit;
    this.account = account;
  }
}


バックエンドの場合

▼ 定義方法

*実装例*

<?php

class Foo
{
    private $fruit;
    private $account;

    public function __construct($fruit, $account)
    {
        $this->fruit = $fruit;
        $this->account = $account;
    }
}


05. オブジェクトデータの変換

フロントエンドの場合

▼ シリアライズ:JS型からJSON

JS型オブジェクトからJSONへの変換には、JSON.stringfyメソッドを使用する。

*実装例*

const object = {
  fruit: ["banana", "apple"],
  account: 200,
};

// シリアライズ
const json = JSON.stringify(object);

console.log(json);
// {"fruit":["banana","apple"],"account":200}

▼ デシリアライズ:JSONからJS型

JSONからJS型オブジェクトへの変換には、JSON.parseメソッドを使用する。

レスポンスされたJSONはエスケープされていることに注意する。

*実装例*

const escapedJson = '{"fruit":["banana","apple"],"account":200}';

console.log(escapedJson); // {"fruit":["banana","apple"],"account":200}

// デシリアライズ
const object = JSON.parse(escapedJson);

console.log(object);
// { fruit: [ 'banana', 'apple' ], account: 200 }

▼ 相互パースメソッドを持つクラス

*実装例*

シリアライズとデシリアライズを行うクラスを以下に示す。

class StaffParser {
  // デシリアライズによるJS型データを自身に設定
  constructor(properties) {
    this.id = properties.id;
    this.name = properties.name;
  }

  //-- デシリアライズ (JSONからJavaScriptへ)  --//
  static deserializeStaff(json) {
    // JS型オブジェクトの定義方法
    return new StaffParser({
      id: json.id,
      name: json.name,
    });
  }

  //-- シリアライズ (JavaScriptからJSONへ)  --//
  static serializeCriteria(criteria) {
    // JSONの定義
    const json = {
      id: null,
      name: null,
    };

    // ID
    if (criteria.id) {
      // JSONを作成する。
      json.id = _.trim(criteria.id);
    }

    // 氏名
    if (criteria.name) {
      json.name = _.trim(criteria.name);
    }
  }
}


バックエンドの場合

▼ デシリアライズ:JSONからPHP型

JSONからPHP型オブジェクトの変換には。

json_decodeメソッドを使用する。

第二引数がfalseの場合、object形式オブジェクトに変換する。

リクエストで送信するJSONはエスケープする必要があることに注意する。

<?php

// リクエストで取得したJSON
$escapedJson = '{\"fruit\":[\"banana\",\"apple\"],\"account\":200}';

// object形式オブジェクトに変換
$object = json_decode($escapedJson, false);

var_dump($object);
//  object(stdClass)#1 (2) {
//    ["fruit"]=>
//    array(2) {
//      [0]=>
//      string(9) "banana"
//      [1]=>
//      string(9) "apple"
//    }
//    ["account"]=>
//    int(200)
//  }

第二引数がtrueの場合、連想配列形式に変換する。

<?php

// リクエストで取得したJSON
$escapedJson = '{\"fruit\":[\"banana\",\"apple\"],\"account\":200}';

// 連想配列形式オブジェクトに変換
$array = json_decode($escapedJson, true);

var_dump($array);
//  array(2) {
//    ["fruit"]=>
//    array(2) {
//      [0]=>
//      string(9) "banana"
//      [1]=>
//      string(9) "apple"
//    }
//    ["account"]=>
//    int(200)
//  }

▼ シリアライズ:PHP型からJSON

<?php

$object = '{"fruit":["banana","apple"],"account":200}';

// JSONに変換
$json = json_encode($object);

var_dump($json);
// ""{\"fruit\":[\"banana\",\"apple\"],\"account\":200}""