Android StudioでJsonを使う方法

## はじめに
外部からAPIとか使ってJsonを持ってくる方式については多かったけども、
内部に置く方法が意外と少なかったから覚書程度に書く。

## 内容
+ AndroidでJsonを使おう
+ AndroidStudioの内部にJsonを置いて使う方法

## Json準備
### Jsonファイル
今回使うJsonファイル

``` json:Sample.json
{
  "sample": [
    {
      "name": "Andy",
      "age": 31,
      "gender": false,
      "other": ""
    },
    {
      "name": "Bob",
      "age": 14,
      "gender": false,
      "other": "Student"
    },
    {
      "name": "Carry",
      "age": 22,
      "gender": true,
      "other": "Rich"
    },
    {
      "name": "Daniel",
      "age": 1,
      "gender": false,
      "other": "Baby"
    },
    {
      "name": "Emily",
      "age": 80,
      "gender": true,
      "other": "Grand"
    }
  ]
}
```

### 設置
AndroidStudio上でAssetフォルダを作成。
画像を参考に。
<img width="780" alt="スクリーンショット 2019-12-06 19.37.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383695/bbe9c0f3-536f-85b6-47e4-afa0663f9340.png">

作ったAssetフォルダの中にJsonファイルを設置。

## 読みこみ
### Jsonからのデータ読み込み
String型のデータで読み込む。

``` kotlin:MainActivity.kt
val assetManager = resources.assets //アセット呼び出し
val inputStream = assetManager.open("Sample.json") //Jsonファイル
val bufferedReader = BufferedReader(InputStreamReader(inputStream)) 
val str: String = bufferedReader.readText() //データ
```

strの中にJsonのデータがString型で入る。

### Jsonで使う
結構派閥あるから、他にもやり方はいっぱいあると思う。

``` kotlin:MainActivity.kt
try {
  val jsonObject = JSONObject(str)
  val jsonArray = jsonObject.getJSONArray("sample")
  for (i in 0 until jsonArray.length()) {
    val jsonData = jsonArray.getJSONObject(i)
    Log.d("Check", "$i : ${jsonData.getString("name")}")
  }
} catch (e: JSONException) {
  e.printStackTrace()
}
```
実行結果

```
D/Check: 0 : Andy
D/Check: 1 : Bob
D/Check: 2 : Carry
D/Check: 3 : Daniel
D/Check: 4 : Emily
```

このデータを他に色々使おうねっていう。

#### 部分説明

`"sample"`の部分はjson内のテーブル（？）名

```kotlin
jsonObject.getJSONArray("sample")
```

`"name"`の部分で引っ張るデータが変わる。
引っ張りたい型名によってgetが変わる

```kotlin
jsonData.getString("name")
jsonData.getInt("age")
jsonData.getBoolean("gender")
```

## おしまい
ほとんど自分のための覚書だからわかりづらいとかあれば修正します。

## 使ったプログラム（一応）

### Activity

```kotlin:MainActivity.kt
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import org.json.JSONException
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val assetManager = resources.assets
        val inputStream = assetManager.open("Sample.json")
        val bufferedReader = BufferedReader(InputStreamReader(inputStream))
        val str: String = bufferedReader.readText()
        Log.d("check", str)
        try {
            val jsonObject = JSONObject(str)
            val jsonArray = jsonObject.getJSONArray("sample")
            val layout = mainLinerLayout
            for (i in 0 until jsonArray.length()) {
                val jsonData = jsonArray.getJSONObject(i)

                Log.d("Check", "$i : ${jsonData.getString("name")}")

            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
    }
}
```

### Json
（上に書いたのと一緒）

``` json:Sample.json
{
  "sample": [
    {
      "name": "Andy",
      "age": 31,
      "gender": false,
      "other": ""
    },
    {
      "name": "Bob",
      "age": 14,
      "gender": false,
      "other": "Student"
    },
    {
      "name": "Carry",
      "age": 22,
      "gender": true,
      "other": "Rich"
    },
    {
      "name": "Daniel",
      "age": 1,
      "gender": false,
      "other": "Baby"
    },
    {
      "name": "Emily",
      "age": 80,
      "gender": true,
      "other": "Grand"
    }
  ]
}
```