JSONについてのまとめ

初めての投稿です！(* ॑  ॑*)


# 自己紹介

HAL大阪四年生二年IT学科Web専攻所属(現H30年)

# 仕様
とりあえず色々と探りながら授業での復習も兼ねて投稿していきます！
知っておいた方がいいよ！という技術や知識等あればコメントにてお願いします！

# 記事について
今回の記事は、HEW2019で初めて使用するJSONについて自分なりにまとめてみました。

# HEW2019とは
私の学校（HAL大阪）でHEW（HAL EVENT WEEK）と呼ばれる学内コンテストのような学校行事があります。
1年生から3年生までの全学生が日別でそれぞれ自分の制作物を展示したりします。
様々な賞もあり、優秀な作品を間近で見れるのですごく刺激になります。
***

<FONT COLOR="#33CC33">↓下記から記事開始</FONT>

***

# JSON形式とは
JavaScriptの処理の中でオブジェクトを記述するためのデータ形式  
今回はPHPで受け取ったDBの値をJSON形式にして使ってる。

### 形状

```txt
{
    “食べ物”: [
        ”果物”：“バナナ”, 
        ”野菜”：”キャベツ”, 
        ”お肉”：”牛肉”
    ]
}
```
####特徴
* 「キーと値」はコロン(:)で区切る。
* 「キーと値」のペアとペアの間はカンマ(,)で区切る。
* 複数の値を登録する際は、角括弧[…]の中に記述し、値をカンマ(,)で区切る。
  
## JSON形式に変換してみよう！


### １：json_encode関数を使用して値をJSON形式に変換する方法

#### json_encode関数とは？

指定した値をJSON形式に変換した文字列にして返す関数です。
処理が失敗した場合は<B>FALSE</B>を返します。

~~~php
<?php
//基本形式
string json_encode( $値 [, JSON定数 [, 深さ = 512 ]] );
?>
~~~


***
####元となる配列を作成してみよう

#####<font color="#cccc">↓見本配列（DBでも大丈夫です。）</font>

~~~php
<?php
//PHPで配列を作る
$arr = array(
  "uses" => array(
     [
       "name" => "春太郎",//名前
       "graduate" => "大阪",//出身
       "maker" => "男",//性別
       "age" => "20",//年齢
       "birthday" => array(//誕生日
         "year"=>"1998",
         "moon"=>"04",
         "day"=>"01"
       )
    ],
    [
      "name" => "春花子",//名前
      "graduate" => "大阪",//出身
      "maker" => "女",//性別
      "age" => "19",//年齢
      "birthday" => array(//誕生日
        "year"=>"1999",
        "moon"=>"01",
        "day"=>"01"
      )
    ]
  )
);

?>
~~~
***
####JSON形式に文字列を変換してみよう

##### <font color="#cccc">↓今回使用したJSONの定義済み定数</font>

######`JSON_UNESCAPED_UNICODE (integer)`
　マルチバイト Unicode 文字をそのままの形式で扱います (デフォルトでは \uXXXX にエスケープします)。 PHP 5.4.0 以降で使用可能です。

######`SON_UNESCAPED_SLASHES (integer)`
　「 / 」 をエスケープしません。 PHP 5.4.0 以降で使用可能です。

######`JSON_NUMERIC_CHECK (integer)`
　数値形式の文字列を数値としてエンコードします。 PHP 5.3.3 以降で使用可能です。

######`JSON_PRETTY_PRINT (integer)`
　返される結果の書式を、スペースを使って整えます。 PHP 5.4.0 以降で使用可能です。

######`JSON_FORCE_OBJECT (integer)`
　非連想配列を使用した場合に、配列ではなくオブジェクトを出力します。 
　出力を受け取る側がオブジェクトを期待しており、配列が空っぽである場合などに特に便利です。 この定数は PHP 5.3.0 以降で使用可能です。

その他の定義済み定数 ：（ http://php.net/manual/ja/json.constants.php ）


#####<font color="#cccc">↓JSON形式に変換する見本</font>


~~~php
<?php
//JSON形式に文字列を変換
$arr = json_encode($arr , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK  | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT );

//ファイルに保存 文字列の文字コードを指定（文字化防止）
file_put_contents("sample/test.json" , mb_convert_encoding($arr, 'utf-8'));
~~~
<font color="#33cc33">緑の文字</font>は上記に記載来ている定義済み定義です。
「｜」で定義済み定義を区切りましょう。
ファイルに変換する際、文字化けしないようにmb_convert_encoding関数でUTF-8に変換しておきましょう。
####実際にエンコードされたデータ
~~~JSON
{
 "uses": {
      "0": {
          "name":"春太郎",
          "graduate": "大阪",
          "maker": "男",
          "age": "20",
          "birthday":{
            "year":"1998",
            "moon":"04",
            "day":"01"
          }
      },
     "1": {
          "name":"春花子",
          "graduate": "大阪",
          "maker": "女",
          "age": "19",
          "birthday":{
            "year":"1999",
            "moon":"01",
            "day":"01"
          }
       }

~~~

Json形式ではコメントはありません。
指定もできないので、もしコメントを書きたい場合は

~~~JSON
{
  "_comment": "コメント内容"
}
~~~
と書くのが無難のようです。

***

### 2：JSON形式のデータを取得する方法
#### json_decode関数とは？
JSON形式でエンコードされたデータを、デコードしてPHPで扱える変数に変換する関数のことです。
#####<font color="#cccc">↓下記で使用する関数</font>

######`file_exists();` 
　ファイルまたはディレクトリが存在するかどうか調べる
######`file_get_contents();`
　ファイルの内容を全て取得する
######`mb_convert_encoding(); `
　文字エンコードを変換する。
　文字化けをしないように文字コードも指定する
######`json_decode();`
　文字デコードを変換する
　JSON エンコードされた文字列を受け取り、それを PHP の変数に変換します。

#####<font color="#cccc">↓JSON形式に変換して出力までの見本</font>

~~~php
<?php
//先ほど作成したtest.jsonファイルを変数に入れます。
$jsonUrl = "./sample/test.json"; 
//ディレクトリが存在するか調べる。
if(file_exists($jsonUrl)){
  //ファイル内容を全て取得する
  $json = file_get_contents($jsonUrl);
  //取得したファイルをエンコードする。
  $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  //文字をデコードする。
  $obj = json_decode($json,true);
  $obj = $obj["uses"];
  foreach ($obj as $key => $val){
    echo "<p>名前：".$val["name"]."</p>";
    echo "<p>出身地：".$val["graduate"]."</p>";
    echo "<p>性別：".$val["maker"]."</p>";
    echo "<p>誕生日：".$val["birthday"]["year"]."/";
    echo $val["birthday"]["moon"]."/";
    echo $val["birthday"]["day"]."</p>";
  }
}
~~~

以上となります。

#####<font color="#cccc">↓おまけ</font>
出力の際switchで仕分けする場合

~~~php
$jsonUrl = "./tpl/test.json"; //JSONファイルの場所とファイル名を記述
if(file_exists($jsonUrl)){
  $json = file_get_contents($jsonUrl);
  $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  $obj = json_decode($json,true);
  $obj = $obj["uses"];
  foreach ($obj as $key => $val){
    switch ($val["maker"]) {
      case '男':
      $man[]=$val;
        break;
      case '女':
      $woman[]=$val;
        break;
      default:
      $other[]=$val;
        break;
    }
  }
}  

~~~

`$man[]=$val;`で＄valに入っている配列が移される。


***
### 今回の参考資料


 １． <a href="http://php.net/manual/ja/json.constants.php"target="_blank"><font color="#33cc33">PHP公式サイト JSON〜定義済み定数〜 </font><a> 


### ご挨拶

最後まで読んでいただきありがとうございました。
文面等見にくい部分が多々あるかと思いますが、「このやり方おすすめ！」や「私はこのやり方やってるよ！」等ご意見くださると嬉しいです。
もっと成長できるように、たくさん勉強しながら記事を書いていこうと思っていますので、よろしくお願い致します。

####SNS
<a href="https://twitter.com/oga_osayo"target="_blank"><font color="#33cc33">Twitter</font></a>
<a href="https://www.facebook.com/profile.php?id=100018334369337"target="_blank"><font color="#33cc33">Facebook</font></a>
<a href="https://github.com/yosa34"target="_blank"><font color="#33cc33">Github</font></a>
***


<font color="#cc3333"> ＊上記の投稿は個人によるもので、団体を代表するものではありません。ご了承くださいますようお願い致します。 </font>