Как правильно проанализировать Firestore API JSON? - PullRequest
1 голос
/ 29 мая 2019

Я использую Google Cloud Firestore API для проекта, который предполагает простой поиск данных из базы данных сервера. Установив все, я не могу понять, как правильно проанализировать возвращенный JSON, так как все мои попытки оказались безуспешными. Использование пакета Firestore исключено, поскольку это определенный проект.

Я попробовал классический подход, так как Android-студия получает только полевую часть со своим соединением HTTPURLC. Это структура JSON:

{
    "documents": [
    {
        "name": "projects/...",
        "fields": {
            "name": {
                "stringValue": "Q1"
            },
            "myValues": {
                "arrayValue": {
                    "values": [
                    {
                        "stringValue": "First"
                    }
                    ]
                }
            },
            "index": {
                "integerValue": "0"
            }
        },
        "createTime": "2019-05-24T10:07:10.864421Z",
        "updateTime": "2019-05-28T07:52:34.445600Z"
    }
    ]
}

Вот моя попытка парсинга:


public ArrayList<Question> parse(String json)
{
    ArrayList<Question> list = new ArrayList<Question>();
    try {
        int indeks=0;
        String qName="";
        ArrayList<String> answerList= new ArrayList<String>();
        JSONObject object = new JSONObject(json);
        JSONArray dokumenti = object.getJSONArray("documents");
        for (int j = 0; j < dokumenti.length(); j++) {
            JSONObject jObject = dokumenti.getJSONObject(j);
            if (jObject.has("index")) indeks = jObject.getInt("index");
            if (jObject.has("name")) qName= jObject.getString("name");
            JSONArray answerArray= jObject.getJSONArray("myValues");
            for (int i = 0; i < answerArray.length(); i++) {
                try {
                    String answer= answerArray.getString(i);
                    answerList.add(answer);
                } catch (JSONException e) {
                    Log.d("OOPS", qName);
                }
            }
        }
        list.add(new Question(qName, qName, answerList, answerList.get(indeks), 0));
    }
    catch(JSONException e)
    {
        //something
    }
    return list;
}

Структура базы данных

Я ожидаю, что все документы будут проанализированы и добавлены в list ArrayList, но, похоже, ничего не происходит, и я не могу найти TAG в Logcat.

1 Ответ

1 голос
/ 29 мая 2019

Похоже, вы пытаетесь получить index, прежде чем получить доступ к его родителю fields.

if (jObject.has("index")) indeks = jObject.getInt("index");

В этой строке вы должны были получить до родительского объекта fields, иначе у вас не будет доступа к index или name.

EDIT

Я проверял ваш код, а вы неправильно что-то анализируете. Пойдем шаг за шагом:

  1. Вы пытаетесь получить доступ к дочерним элементам fields без доступа к их родителям. Решение, соответствующее вашей структуре, будет выглядеть примерно так:
JSONObject jObject = dokumenti.getJSONObject(j);
JSONObject fields = jObject.getJSONObject("fields");
if (fields.has("index") && fields.getJSONObject("index").has("integerValue")) {
    indeks = fields.getJSONObject("index").getInt("integerValue");
}
if (fields.has("name") && fields.getJSONObject("name").has("stringValue")) {
    qName = fields.getJSONObject("name").getString("stringValue");
}
  1. Вы также пытаетесь получить доступ к массиву myValues, не учитывая иерархию объектов. Правильный путь должен быть примерно таким:
JSONArray answerArray = fields.getJSONObject("myValues").getJSONObject("arrayValue").getJSONArray("values");
for (int i = 0; i < answerArray.length(); i++) {
   try {
      String answer = answerArray.getJSONObject(i).getString("stringValue");
      answerList.add(answer);
   } catch (JSONException e) {
      Log.d("OOPS", qName);
   }
}

С этими изменениями я смог без проблем проанализировать Json, который вы опубликовали. Здесь вы можете найти полный код:

public ArrayList<Question> parse(String json)
    {
        ArrayList<Question> list = new ArrayList<Question>();
        try {
            int indeks = 0;
            String qName = "";
            ArrayList<String> answerList = new ArrayList<String>();
            JSONObject object = new JSONObject(json);
            JSONArray dokumenti = object.getJSONArray("documents");
            for (int j = 0; j < dokumenti.length(); j++) {
                JSONObject jObject = dokumenti.getJSONObject(j);
                JSONObject fields = jObject.getJSONObject("fields");
                if (fields.has("index") && fields.getJSONObject("index").has("integerValue")) {
                    indeks = fields.getJSONObject("index").getInt("integerValue");
                }
                if (fields.has("name") && fields.getJSONObject("name").has("stringValue")) {
                    qName = fields.getJSONObject("name").getString("stringValue");
                }
                JSONArray answerArray = fields.getJSONObject("myValues").getJSONObject("arrayValue").getJSONArray("values");
                for (int i = 0; i < answerArray.length(); i++) {
                    try {
                        String answer= answerArray.getString(i);
                        answerList.add(answer);
                    } catch (JSONException e) {

                        Log.d("OOPS", qName);
                    }
                }
            }
            list.add(new Question(qName, qName, answerList, answerList.get(indeks), 0));
        }
        catch(JSONException e)
        {
            //something
        }
        return list;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...