This是我找到的最接近的问题,但仍然不是我想要的。
我正在使用google Firestore保存用户信息(号码、性别等)。我使用JSON自定义对象进行保存,但是当我尝试获取信息时,我无法再次转换为JSON对象。
private void getUserData() {
ffDatabase.collection(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
JSONObject user = new JSONObject(task.getResult()
.toObjects(JSONObject.class).get(0));
DataStorageTemporary.getInstance().setJsonUser(user);
} else {
Log.w("ERROR load data", "Error getting documents.", task.getException());
}
}
});
}
我试图从任务()中获取JSON object,但它不起作用:
task.getResult().toObjects(JSONObject.class).get(0)
我知道我可以将QuerySnapshot更改为DocumentSnapshot,,但是我仍然无法从获取JSON对象。
发布于 2018-06-01 17:13:58
您需要创建一个自定义用户类,然后使用该POJO写入firestore,就像@Doug Stevenson所说。从docs中查看以下内容
使用Java Map对象表示文档的自定义对象通常不太方便,因此Cloud Firestore还支持使用自定义类编写您自己的Java对象。Cloud Firestore将在内部将对象转换为支持的数据类型。
发布于 2018-06-01 07:21:03
Firestore不存储JSON。它存储具有强类型值的键/值对。当你在Android上阅读文档时,你有两个选择来获取这些字段:
发布于 2019-06-20 04:34:14
ApiFuture<QuerySnapshot> future = db.collection(collection).get();
List<QueryDocumentSnapshot> documents = future.get().getDocuments();
遍历DocumentSnapshots并使用递归创建JSONObject。您可以在DocumentSnapshot
对象上使用getData()
来获取Firestore文档的映射,然后可以解析该对象并创建您自己的JSONObject。
for (DocumentSnapshot document : documents) {
JSONObject obj = mapToJSON(document.getData());
// Other stuff here ...
}
private JSONObject mapToJSON(Map<String, Object> map) {
JSONObject obj = new JSONObject();
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof Map) {
Map<String, Object> subMap = (Map<String, Object>) value;
obj.put(key, mapToJSON(subMap));
} else if (value instanceof List) {
obj.put(key, listToJSONArray((List) value));
}
else {
obj.put(key, value);
}
}
return obj;
}
private JSONArray listToJSONArray(List<Object> list) {
JSONArray arr = new JSONArray();
for(Object obj: list) {
if (obj instanceof Map) {
arr.add(mapToJSON((Map) obj));
}
else if(obj instanceof List) {
arr.add(listToJSONArray((List) obj));
}
else {
arr.add(obj);
}
}
return arr;
}
https://stackoverflow.com/questions/50633157
复制相似问题