получить объект JSON из Google Cloud Firestore - PullRequest
0 голосов
/ 01 июня 2018

Этот был самым близким вопросом, который я нашел, но все еще не то, что я ищу.

Я использую Google Firestore для сохранения информации пользователя (номер, пол и т. д.).Я использую пользовательский объект JSON для сохранения, но когда я пытаюсь получить информацию, я не могу снова преобразовать в объект JSON.

private void getUserData() {
    //Get user from DB
    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());
                    }
                }
            });
}

Я пытался получить из Task (результат) объект JSON как этот task.getResult().toObjects(JSONObject.class).get(0).Но это не сработает.

Я знаю, что могу изменить QuerySnapshot на DocumentSnapshot , но я все еще не могу получить объект JSON из.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вам нужно создать пользовательский класс пользователя, а затем написать в firestore, используя этот POJO, как говорит @Doug Stevenson.см. docs :

"Пользовательские объекты Использование объектов карты Java для представления ваших документов часто не очень удобно, поэтому Cloud Firestore также поддерживает написание ваших собственных объектов Java спользовательские классы. Cloud Firestore внутренне преобразует объекты в поддерживаемые типы данных. "

0 голосов
/ 19 июня 2019
ApiFuture<QuerySnapshot> future = db.collection(collection).get();
List<QueryDocumentSnapshot> documents = future.get().getDocuments();

Выполните итерации по DocumentSnapshots и используйте рекурсию для создания JSONObject.Вы можете использовать getData() на DocumentSnapshot объекте, чтобы получить карту вашего документа 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;
    }
0 голосов
/ 01 июня 2018

Firestore не хранит JSON.Он хранит пары ключ / значение со строго типизированными значениями.Когда вы читаете документ на Android, у вас есть два варианта получить эти поля:

  1. Автоматически отображать пары ключ / значение в POJO, который соответствует стандартам JavaBeans.JSONObject не является допустимым объектом типа JavaBean.
  2. Доступ к каждой паре ключ / значение из документа по отдельности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...