将一个JSONAray项转换为多个项

时间:2016-10-15 06:41:36

标签: java arraylist

我有以下字符串,它以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" }}]

以上信息来自DB:

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 个答案:

答案 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) );
    }