/// <summary>
        /// Read key-value pairs
        /// </summary>
        /// <typeparam name="T">Value type</typeparam>
        /// <returns>Dictionary, key as string, value as specified type. Returns nothing if failed to deserialize.</returns>
        public DictionaryCallback <string, T> ReadKeyValuePairs <T>()
        {
            DictionaryCallback <string, T> callbackHandler = new DictionaryCallback <string, T>();

            string route = FirebaseConfig.endpoint + path + ".json" + GetAuthParam();

            RESTHelper.Get(route, res =>
            {
                var resData = fsJsonParser.Parse(res.Text);

                object deserializedRes = null;

                fsSerializer serializer = new fsSerializer();
                serializer.TryDeserialize(resData, typeof(Dictionary <string, T>), ref deserializedRes);

                Dictionary <string, T> destructuredRes = (Dictionary <string, T>)deserializedRes;

                callbackHandler.successCallback?.Invoke(destructuredRes);
            },
                           err =>
            {
                callbackHandler.exceptionCallback?.Invoke(err);
            });

            return(callbackHandler);
        }
        /// <summary>
        /// Read key-value pairs
        /// </summary>
        /// <returns>Dictionary, key is string and value is object, it can be any primitive types or fsData</returns>
        public DictionaryCallback <string, object> ReadKeyValuePairs()
        {
            DictionaryCallback <string, object> callbackHandler = new DictionaryCallback <string, object>();

            string route = FirebaseConfig.endpoint + path + ".json" + GetAuthParam();

            RESTHelper.Get(route, res =>
            {
                var resData = fsJsonParser.Parse(res.Text); //in JSON
                Dictionary <string, object> destructuredRes = new Dictionary <string, object>();

                if (resData.IsDictionary)
                {
                    resData.AsDictionary.ToList().ForEach(x => destructuredRes.Add(x.Key, x.Value._value));
                    callbackHandler.successCallback?.Invoke(destructuredRes);
                    return;
                }
                //No collection, single result (key-value pair)
                string[] splittedPaths = path.Split('/');
                destructuredRes.Add(splittedPaths[splittedPaths.Length - 1], resData._value); //last path as key, resData._value as object
                callbackHandler.successCallback?.Invoke(destructuredRes);
            },
                           err =>
            {
                callbackHandler.exceptionCallback?.Invoke(err);
            });

            return(callbackHandler);
        }