Конвертировать один элемент 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.) получить activity
jsonobject
а затем просто использовать свой индекс, чтобы получить значения для 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.
Проверка недействительности: Иногда вы можете увидеть некоторые исключения, когда значения недоступны, поэтому в тех случаях, когда вы не уверены в наличии значения, используйте optInt
optBoolean
и т.д., который просто вернет значение по умолчанию, если оно отсутствует, и даже попытается преобразовать значение в 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) );
}