【问题标题】:Convert one JSONAray item into multiple Items将一个 JSONAray 项目转换为多个项目
【发布时间】:2016-10-15 06:41:35
【问题描述】:

我有以下字符串,它以列表的形式从数据库返回,我的假设是,列表包含 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" }}]

以上信息来自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;

【问题讨论】:

  • 这是 json 你需要在你的模型类中解析列表
  • 您的列表包含 3 个项目 activity,每个项目还包含您的单个 item object
  • @PavneetSingh,是的,我的列表包含 4 个项目,但显示大小为 1。
  • 我不知道你是如何解析它的,或者你可能没有解析它,但你必须(使用已经给出的答案作为开头)
  • 我已经使用了一些其他的库来解析它,但是 jsonArray 的大小只有一个而不是 3

标签: java arraylist


【解决方案1】:

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

2.) 遍历数组并使用索引i 检索您的jsonObject

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 类,稍后只需使用 @987654323 @

空值检查:有时您可能会在值不可用时看到一些异常,因此在您不确定是否存在值的情况下 所以使用optIntoptBoolean等,如果它不存在,它将简单地返回默认值,甚至尝试将值转换为int,如果它是string 喜欢

来自docs

获取与键关联的可选 int 值,或者默认值,如果 没有这样的键或者值不是数字。如果值为 字符串,将尝试将其评估为数字。

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

例如

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

【讨论】:

  • 如果您可以控制此 DB 输出,那么我建议您将 activity 索引为单个数组,包含所有其他对象,这样会更有效,而不是包含 3 个对象单个 -2 对象
【解决方案2】:

您必须使用 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) );
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2012-03-10
    • 2011-12-29
    • 2019-06-12
    • 2012-09-21
    相关资源
    最近更新 更多