首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Google Cloud Firestore获取JSON对象

从Google Cloud Firestore获取JSON对象
EN

Stack Overflow用户
提问于 2018-06-01 05:37:39
回答 4查看 6.7K关注 0票数 2

This是我找到的最接近的问题,但仍然不是我想要的。

我正在使用google Firestore保存用户信息(号码、性别等)。我使用JSON自定义对象进行保存,但是当我尝试获取信息时,我无法再次转换为JSON对象。

代码语言:javascript
复制
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对象。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-01 17:13:58

您需要创建一个自定义用户类,然后使用该POJO写入firestore,就像@Doug Stevenson所说。从docs中查看以下内容

使用Java Map对象表示文档的自定义对象通常不太方便,因此Cloud Firestore还支持使用自定义类编写您自己的Java对象。Cloud Firestore将在内部将对象转换为支持的数据类型。

票数 2
EN

Stack Overflow用户

发布于 2018-06-01 07:21:03

Firestore不存储JSON。它存储具有强类型值的键/值对。当你在Android上阅读文档时,你有两个选择来获取这些字段:

  1. 自动将键/值对映射到符合JavaBeans标准的POJO。JSONObject不是有效的JavaBean类型对象。
  2. 单独访问文档中的每个键/值对。
票数 2
EN

Stack Overflow用户

发布于 2019-06-20 04:34:14

代码语言:javascript
复制
ApiFuture<QuerySnapshot> future = db.collection(collection).get();
List<QueryDocumentSnapshot> documents = future.get().getDocuments();

遍历DocumentSnapshots并使用递归创建JSONObject。您可以在DocumentSnapshot对象上使用getData()来获取Firestore文档的映射,然后可以解析该对象并创建您自己的JSONObject。

代码语言:javascript
复制
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;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50633157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档