Help us understand the problem. What is going on with this article?

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

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

forqiiita3.png

環境

PC: MacBook Air
Firebase Database: Realtime Database

参考文献

データの取得


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

現象説明

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

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

スクリーンショット 2019-09-07 19.23.59.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://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://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://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文がめんどくさくならずにすんで良かったです!

以上!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away