Firebaseから.jsonでデータ取得してきたら、nullがたくさん入っていた！その理由と解決方法！

# UnityでFirebaseからデータとってObjectを配置しようとした際、jsonにnullがたくさん入ってしまっている事象に会いました！あまり同じ現象になる方はいないと思うのですが、原因がわかったので、多null仲間がいた時のために書きます！（Firebase内完結でUnityは内容には出てこないです）

![forqiiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/b6a71cfd-79a3-1532-8077-9663995072fc.png)

## 環境
PC: MacBook Air
Firebase Database: Realtime Database

## 参考文献
[データの取得](https://firebase.google.com/docs/database/rest/retrieve-data?hl=ja#%E3%82%AD%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)

---

 (:baby_tone2:以下、現象説明と解決:baby_tone2:)

### 現象説明

##### FirebaseのAuthを利用し、そこで発番されたUIDをユーザ識別子として、ユーザ毎にアイテムを保持させたいと思い、下記のような形でFirebaseのデータベースを構成していた

ざっと言葉で説明すると、
/users/の配下が　UID で区切られていて、UID毎に、user_idという連番のユニーク値を持ち、
/items/の配下は　user_id　で区切った後、連番で区切ってアイテムを格納している形

![スクリーンショット 2019-09-07 19.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/fd6d08d4-5238-4c10-8d38-4b24ad1b619f.png)

##### そして、user_id = 1 の保持アイテム一覧を表示させたいと思ってjsonを表示させてみたところ、TOPにnullが入ってしまっていた

`https://forjsontest.firebaseio.com/hohoho/gegege/items/1.json?print=pretty`

```
[ null, {
  "amount" : 1,
  "name" : "apple"
}, {
  "amount" : 2,
  "name" : "orange"
}, {
  "amount" : 3,
  "name" : "banana"
} ]
```

##### あれ？、と思ってitems全体をjson表示させてみたところ、nullがたくさん入っていた

`https://forjsontest.firebaseio.com/hohoho/gegege/items/.json?print=pretty`

```
[ null, [ null, {
  "amount" : 1,
  "name" : "apple"
}, {
  "amount" : 2,
  "name" : "orange"
}, {
  "amount" : 3,
  "name" : "banana"
} ], [ null, {
  "amount" : 1,
  "name" : "grape"
}, {
  "amount" : 5,
  "name" : "apple"
} ] ]
```

この時は、どうやらパスとして使っているitemsとかのvalueが勝手にnullになって入っちゃってるのかな〜
などと思い、あとでfor回すときに除去しなくちゃなのか。。
と思っていた

##### だが、メンターの先生に、なんか取り方とかがおかしいんじゃない？keyを数字ってあまりみたことないよね。。とご指摘を受け、
試しに、user_id = u1 となるようなデータを追加してみたところ、

![スクリーンショット 2019-09-07 19.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/766ea879-957b-8510-1ba8-d3083a041876.png)

`https://forjsontest.firebaseio.com/hohoho/gegege/items/.json`

```
{
  "1" : [ null, {
    "amount" : 1,
    "name" : "apple"
  }, {
    "amount" : 2,
    "name" : "orange"
  }, {
    "amount" : 3,
    "name" : "banana"
  } ],
  "2" : [ null, {
    "amount" : 1,
    "name" : "grape"
  }, {
    "amount" : 5,
    "name" : "apple"
  } ],
  "u1" : [ null, {
    "amount" : 3,
    "name" : "lemon"
  } ]
}
```

##### TOPにあったnullが消えた！！

### 解決

##### 原因はkeyが数値のみだったこと！

keyが数値のみだと、何かしらの力が働くのか数値がkeyとして表示されずに省略され、valueだけが表示されてしまう模様

（※最初は数値が連番だから key=0 が補充されているのかなどと考え、試しに u1 ではなく飛び番の 5 をkeyにしてみた所、やはりTOPにnullが入ってしまったので、数値のみの場合に起きてしまう現象の模様）

数値のkeyはパスとして使っているのでvalueがnullだから、結果として、nullがデータにたくさん入ってしまっているように見える

##### 数値以外のkeyが追加されると、数値もkeyとして表示されるようになる

なので、"u1"のkeyを追加した所、それまで表示されていなかったuser_idの数値keyたちがkeyとして文字列で表示された！

(ちなみに、文字列として数値keyを登録すればu1と同じ結果だったが、それはもはや数値keyではないので当たり前か、、prz)

![スクリーンショット 2019-09-07 20.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/0b992462-63ee-583d-1185-b7cd96aa78c7.png)

`https://forjsontest.firebaseio.com/hohoho/gegege/items/.json`

```
{
  "1" : [ null, {
    "amount" : 1,
    "name" : "apple"
  }, {
    "amount" : 2,
    "name" : "orange"
  }, {
    "amount" : 3,
    "name" : "banana"
  } ],
  "2" : [ null, {
    "amount" : 1,
    "name" : "grape"
  }, {
    "amount" : 5,
    "name" : "apple"
  } ],
  "\"5\"" : [ null, {
    "amount" : 3,
    "name" : "lemon"
  } ]
}
```

（でもエスケープで""が文字列のメンバーになってしまうみたいなのがちょっと気持ち悪い🤮）


##### item_idの方も、i1などにkeyを変更したら、とてもスッキリ！nullが消えました！

![スクリーンショット 2019-09-07 20.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463891/157a277a-ceeb-79ac-15c1-e9ea78e66f72.png)


`https://forjsontest.firebaseio.com/hohoho/gegege/items/u1.json?print=pretty`

```
{
  "i1" : {
    "amount" : 1,
    "name" : "apple"
  },
  "i2" : {
    "amount" : 2,
    "name" : "orange"
  },
  "i3" : {
    "amount" : 3,
    "name" : "banana"
  }
}
```

---

（:alien:振り返り:alien:）

FirebaseのAuthを使いたいがため、Mysqlとかではなく、Firebaseをデータベースとして使おうとしているのですが、ゲームなどのデータをどんな構造でFirebaseで保持すればやりやすいのかがわからないため、手探り状態でやっていたら、こんなことに出会いました。。prz
でもとりあえず、for文がめんどくさくならずにすんで良かったです！

以上！