@@ -109,32 +109,11 @@ public static WritableMap dataSnapshotToMap(
109
109
110
110
public static <Any > Any castSnapshotValue (DataSnapshot snapshot ) {
111
111
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 );
136
116
}
137
- return (Any ) data ;
138
117
} else {
139
118
if (snapshot .getValue () != null ) {
140
119
String type = snapshot .getValue ().getClass ().getName ();
@@ -156,6 +135,88 @@ public static <Any> Any castSnapshotValue(DataSnapshot snapshot) {
156
135
}
157
136
}
158
137
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
+
159
220
public static WritableArray getChildKeys (DataSnapshot snapshot ) {
160
221
WritableArray childKeys = Arguments .createArray ();
161
222
0 commit comments