我有以下字符串,它以List的形式从数据库返回,我的假设是,该列表包含3个项目。 但它只显示" 1"作为大小。所以它将所有活动项目作为一个元素返回。
注意:当我尝试获取列表的第一个索引(list.get(0))时,它只返回一个"活动"不是所有三个(作为单个项目)。我不知道是什么 发生在列表中。
我的问题:如何将包含1个项目(包含3个活动项目)的下面的字符串列表转换为List,将列表大小视为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;
答案 0 :(得分:1)
1。)通过将您的字符串传递给构造函数
来创建json
数组
2。)遍历数组并使用索引jsonObject
i
3。)获取activity
jsonobject
,然后只使用索引获取jsonActivityItem
对象的值。
4。)创建一个POJO类,将您的对象存储在List等集合中,但要确保将它们标记为private
并使用getter和setter进行最佳实践
class User{
String id,kind,result;
int userId,accountId;
long timestamp;
//.. getter & setters
}
注意:要将您的字符串转换为json兼容,您可以使用JsonParser
,请尝试此链接JsonParser snippet
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类,您可以查看this link来创建兼容的POJO类以及稍后只需使用Gson code
无效检查:有时您可能会在值不可用时看到一些异常,因此在您不确定是否存在值的情况下
所以请使用optInt
optBoolean
等,如果不存在则会返回默认值,如果是int
,甚至会尝试将值转换为string
喜欢
来自docs
获取与键关联的可选int值,或默认值if 没有这样的密钥,或者该值不是数字。如果值是 一个字符串,将尝试将其评估为数字。
int block_id = jObj.getInt("key",defaultvalue);
e.g
int block_id = jObj.getInt("userId",0);
答案 1 :(得分: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) );
}