当前位置: 首页 > 知识库问答 >
问题:

将一个JSONAray项转换为多个项

费锋
2023-03-14

我有以下字符串,这是返回从数据库的形式列表,我的假设是,列表包含3个项目。因此,它将所有活动项作为一个元素返回。

注意:当我尝试获取列表的第一个索引(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个答案

欧阳声
2023-03-14

您必须使用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) );
    }
穆商震
2023-03-14

1.)通过将字符串传递给构造函数来创建json数组

2.)遍历数组并使用索引i

3.)获取活动jsonobject,然后只需使用索引获取jsonActivityItem对象的值。

4.)创建一个POJO类,将对象存储在列表等集合中,但确保将它们标记为私有的,并使用getter和setters作为最佳实践

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等,如果不存在,则只返回默认值,如果存在,甚至尝试将值转换为intstringlike

来自文档

获取与某个键关联的可选int值,如果没有此类键或该值不是数字,则获取默认值。如果该值是字符串,将尝试将其作为数字计算。

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

e. g.

int block_id = jObj.getInt("userId",0); 
 类似资料:
  • 有人知道怎么做吗?显然有一个Windows命令用于这种事情... 谢谢

  • 假设我已将以下对象序列化为json字符串: 现在我想反序列化它,但是我想把名称分成两个字段,和。我该怎么做呢? 我希望最终的结果是类似于: 这对Gson有可能吗?

  • 我正在尝试将单个输入消息转换为多个消息。我有一个带有以下签名的方法: 类类似于: 对于中的每个,我想创建一个的实例。我如何做到这一点并处理

  • 问题内容: 如何将多个PDF文件合并/转换为一个大PDF文件? 我尝试了以下操作,但是目标文件的内容不符合预期: 我需要一个非常简单/基本的命令行(CLI)解决方案。最好的办法是,如果我可以将合并/转换的输出直接传送到管道中(就像我之前在这里提出的问题中最初尝试的那样:Linux管道(convert->pdf2ps-> lp)。 问题答案: 抱歉,我设法使用Google自己找到了答案,还有些运气:

  • 我有以下型号 我试图通过名称和组名称获得一个实例。 我可以用下面的代码来做 但是我想把它变成一个查询。对如何实现这一点有什么想法吗?

  • 我有两个枚举,它们实现了如下相同的接口:- 名为SystemA和SystemB的两个枚举正在实现此接口。 我想要像这样应用getConfigFunction:- 但它会抛出编译时错误,因为形成的流的类型为:Config[]。所以我尝试了以下修改:- 但这也失败了,因为我还需要修改forEach部分。有人能帮忙吗?我该如何修改forEach部分,或者我该如何使用map()/flatmap()函数,这