Конвертировать один элемент JSONAray в несколько элементов

У меня есть следующая строка, которая возвращается из базы данных в виде списка, я предполагаю, что список содержит 3 элемента. но он показывает только "1" в качестве размера. Таким образом, он возвращает все элементы активности как один элемент.

Примечание. Когда я пытаюсь получить первый индекс списка (list.get(0)), он возвращает только одну "активность", а не все три (как один элемент). Я не знаю, что происходит внутри список.

Мой вопрос: Как преобразовать приведенный ниже список строк, который содержит 1 элемент (с 3 элементами активности), в список, который должен учитывать размер списка как 3(3 операции).

[ { "activity" : { "id" : "a_3" , "kind" : "Infomation" , "userId" : 100 , "accountId" : 0 , "timestamp" : 1476369009366 , "result" : "normal"  }} ,
 { "activity" : { "id" : "a_18" , "kind" : "Infomation" , "userId" : 100 , "accountId" : 0 ,"timestamp" : 1476419696003 , "result" : "normal" }} , 
 { "activity" : { "id" : "a_4" , "kind" : "Infomation" , "userId" : 100, "accountId" : 0 , ""timestamp" : 1476435910335 , "result" : "normal" }}]

Приведенная выше информация из БД:

Iterable<DBObject> results =null;
List<String> retList = new ArrayList<>();
        try {
            results= collection.aggregate(pipeline).results();
        } catch (Exception e) {
        }
        if(results!=null){
            Iterator<DBObject> iterator = results.iterator();
            while (iterator.hasNext()) { 
                String input = iterator.next().get("actLogList").toString();
                retList.add(input.substring(input.indexOf("[") + 1, input.lastIndexOf("]")));
            }
        }
        return retList;

2 ответа

1.) создать json массив, передав вашу строку в конструктор

2.) пройти массив и получить ваш jsonObject используя индекс i

3.) получить activityjsonobject а затем просто использовать свой индекс, чтобы получить значения для jsonActivityItem объект.

4.) создайте класс POJO для хранения вашего объекта в коллекции, такой как List и т. Д., Но не забудьте пометить их private и использовать геттер и сеттеры для лучшей практики

class User{
    String id,kind,result;
    int userId,accountId;
    long timestamp;
    //.. getter & setters 
}

Примечание. Для преобразования вашей строки в json-совместимую вы можете использовать JsonParser, попробуйте эту ссылку фрагмент JsonParser

    JSONArray array;
    List<User> listUser=new ArrayList<>(); // to store objects as details
    try {
        array=new JSONArray(st); // st is your string ( make sure to use jsonparser )
        JSONObject jsonActivity;
        JSONObject jsonActivityItem;
        User user;
        for (int i=0;i<array.length();i++) {
            System.out.println();
            jsonActivity=array.getJSONObject(i);
            jsonActivityItem=jsonActivity.getJSONObject("activity");                

            // To store data for later use
            user = new User();
            user.setId(jsonActivityItem.getString("id"));
            user.settimestamp(jsonActivityItem.getLong("timestamp"));
            //..set other values using setters 
            listUser.add(user);

            // to display items

            String id        = jsonActivityItem.optString("id");
            String kind      = jsonActivityItem.optString("kind");
            String userId    = jsonActivityItem.optString("userId");
            String accountId = jsonActivityItem.optString("accountId");
            String timestamp = jsonActivityItem.optString("timestamp");
            String result    = jsonActivityItem.optString("result");
        }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Я бы порекомендовал простой и короткий путь, т.е. используя gson чтобы преобразовать его в список, но вам потребуется использовать класс POJO. Вы можете взглянуть по этой ссылке, чтобы создать совместимый класс POJO, а затем просто использовать код Gson.

Проверка недействительности: Иногда вы можете увидеть некоторые исключения, когда значения недоступны, поэтому в тех случаях, когда вы не уверены в наличии значения, используйте optIntoptBoolean и т.д., который просто вернет значение по умолчанию, если оно отсутствует, и даже попытается преобразовать значение в int если это stringлайк

из документов

Получить необязательное значение типа int, связанное с ключом, или значение по умолчанию, если такого ключа нет или если это значение не является числом. Если значение является строкой, будет сделана попытка оценить его как число.

int block_id = jObj.getInt("key",defaultvalue);

например

int block_id = jObj.getInt("userId",0); 

Вы должны использовать библиотеку GSON для анализа этого массива JSON. Вам нужно сделать что-то похожее на приведенный ниже код.

    JSONArray jsonArray = new JSONArray(jsonArrayString);
    List<String> list = new ArrayList<String>();
    for (int i=0; i<jsonArray.length(); i++) {
        list.add( jsonArray.getString(i) );
    }
Другие вопросы по тегам