@@ -109,32 +109,11 @@ public static WritableMap dataSnapshotToMap(
109109
110110 public static <Any > Any castSnapshotValue (DataSnapshot snapshot ) {
111111 if (snapshot .hasChildren ()) {
112- WritableMap data = Arguments .createMap ();
113- for (DataSnapshot child : snapshot .getChildren ()) {
114- Any castedChild = castSnapshotValue (child );
115- switch (castedChild .getClass ().getName ()) {
116- case "java.lang.Boolean" :
117- data .putBoolean (child .getKey (), (Boolean ) castedChild );
118- break ;
119- case "java.lang.Long" :
120- Long longVal = (Long ) castedChild ;
121- data .putDouble (child .getKey (), (double ) longVal );
122- break ;
123- case "java.lang.Double" :
124- data .putDouble (child .getKey (), (Double ) castedChild );
125- break ;
126- case "java.lang.String" :
127- data .putString (child .getKey (), (String ) castedChild );
128- break ;
129- case "com.facebook.react.bridge.WritableNativeMap" :
130- data .putMap (child .getKey (), (WritableMap ) castedChild );
131- break ;
132- default :
133- Log .w (TAG , "Invalid type: " + castedChild .getClass ().getName ());
134- break ;
135- }
112+ if (isArray (snapshot )) {
113+ return (Any ) buildArray (snapshot );
114+ } else {
115+ return (Any ) buildMap (snapshot );
136116 }
137- return (Any ) data ;
138117 } else {
139118 if (snapshot .getValue () != null ) {
140119 String type = snapshot .getValue ().getClass ().getName ();
@@ -156,6 +135,88 @@ public static <Any> Any castSnapshotValue(DataSnapshot snapshot) {
156135 }
157136 }
158137
138+ private static boolean isArray (DataSnapshot snapshot ) {
139+ long expectedKey = 0 ;
140+ for (DataSnapshot child : snapshot .getChildren ()) {
141+ try {
142+ long key = Long .parseLong (child .getKey ());
143+ if (key == expectedKey ) {
144+ expectedKey ++;
145+ } else {
146+ return false ;
147+ }
148+ } catch (NumberFormatException ex ) {
149+ return false ;
150+ }
151+ }
152+ return true ;
153+ }
154+
155+ private static <Any > WritableArray buildArray (DataSnapshot snapshot ) {
156+ WritableArray array = Arguments .createArray ();
157+ for (DataSnapshot child : snapshot .getChildren ()) {
158+ Any castedChild = castSnapshotValue (child );
159+ switch (castedChild .getClass ().getName ()) {
160+ case "java.lang.Boolean" :
161+ array .pushBoolean ((Boolean ) castedChild );
162+ break ;
163+ case "java.lang.Long" :
164+ Long longVal = (Long ) castedChild ;
165+ array .pushDouble ((double ) longVal );
166+ break ;
167+ case "java.lang.Double" :
168+ array .pushDouble ((Double ) castedChild );
169+ break ;
170+ case "java.lang.String" :
171+ array .pushString ((String ) castedChild );
172+ break ;
173+ case "com.facebook.react.bridge.WritableNativeMap" :
174+ array .pushMap ((WritableMap ) castedChild );
175+ break ;
176+ case "com.facebook.react.bridge.WritableNativeArray" :
177+ array .pushArray ((WritableArray ) castedChild );
178+ break ;
179+ default :
180+ Log .w (TAG , "Invalid type: " + castedChild .getClass ().getName ());
181+ break ;
182+ }
183+ }
184+ return array ;
185+ }
186+
187+ private static <Any > WritableMap buildMap (DataSnapshot snapshot ) {
188+ WritableMap map = Arguments .createMap ();
189+ for (DataSnapshot child : snapshot .getChildren ()) {
190+ Any castedChild = castSnapshotValue (child );
191+
192+ switch (castedChild .getClass ().getName ()) {
193+ case "java.lang.Boolean" :
194+ map .putBoolean (child .getKey (), (Boolean ) castedChild );
195+ break ;
196+ case "java.lang.Long" :
197+ Long longVal = (Long ) castedChild ;
198+ map .putDouble (child .getKey (), (double ) longVal );
199+ break ;
200+ case "java.lang.Double" :
201+ map .putDouble (child .getKey (), (Double ) castedChild );
202+ break ;
203+ case "java.lang.String" :
204+ map .putString (child .getKey (), (String ) castedChild );
205+ break ;
206+ case "com.facebook.react.bridge.WritableNativeMap" :
207+ map .putMap (child .getKey (), (WritableMap ) castedChild );
208+ break ;
209+ case "com.facebook.react.bridge.WritableNativeArray" :
210+ map .putArray (child .getKey (), (WritableArray ) castedChild );
211+ break ;
212+ default :
213+ Log .w (TAG , "Invalid type: " + castedChild .getClass ().getName ());
214+ break ;
215+ }
216+ }
217+ return map ;
218+ }
219+
159220 public static WritableArray getChildKeys (DataSnapshot snapshot ) {
160221 WritableArray childKeys = Arguments .createArray ();
161222
0 commit comments