遍历嵌套的 json 数组正在将先前分配的值添加到数据模型

Posted

技术标签:

【中文标题】遍历嵌套的 json 数组正在将先前分配的值添加到数据模型【英文标题】:looping through nested json array is adding previously assigned value to data model 【发布时间】:2019-12-17 09:48:24 【问题描述】:

请查看这个 json:


  "data": [
    
      "date": "Thursday 1, August, 2019",
      "time": [
        
          "times": "1:13PM to 1:13PM",
          "notice": "testing",
          "category": "Meeting"
        ,
        
          "times": "12:00PM to 1:00PM",
          "notice": "Meeting",
          "category": "Meeting"
        
      ]
    ,
    
      "date": "Friday 2, August, 2019",
      "time": [
        
          "times": "3:00PM to 3:30PM",
          "notice": "Appointment",
          "category": "Meeting"
        ,
        
          "times": "12:00PM to 12:30PM",
          "notice": "Appointment",
          "category": "Meeting"
        
      ]
    ,
    
      "date": "Monday 5, August, 2019",
      "time": [
        
          "times": "11:00AM to 11:30AM",
          "notice": "Obj",
          "category": "Meeting"
        
      ]
    
  ]

我正在将这个 json 数据填充到我的 ArrayList 中,如下所示:

VipPojo playerModel;
try 
    JSONArray dataArray = obj.getJSONArray("data");
    for (int i = 0; i < dataArray.length(); i++) 
        JSONObject dataobj = dataArray.getJSONObject(i);
        JSONArray dataArrays1 = dataobj.getJSONArray("time");
        String date = dataobj.getString("date");
        System.out.println("date: " + date); // here I get correct data (all 3 items);
        for (int j = 0; j < dataArrays1.length(); j++) 
            playerModel = new VipPojo();
            JSONObject dataobj1 = dataArrays1.getJSONObject(j);
            playerModel.setDate(date); // this is adding same previous assigned "date" until loop ends(I get 5 data with duplicate values)
            playerModel.setTimes(dataobj1.getString("times"));
            playerModel.setNotice(dataobj1.getString("notice"));
            playerModel.setCategory(dataobj1.getString("category"));
            dataModelArrayList.add(playerModel);
        
    
 catch (JSONException e) 
    e.printStackTrace();

正如我在上面代码中的 cmets 中提到的,"date" 对象正在将先前分配的值添加到数据模型,因为 setDate() 正在内部循环中使用,这是我不想要的。

你能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

使用 Gson 库Get nested JSON object with GSON using retrofit

对于嵌套对象,使用本身的对象

更多信息https://futurestud.io/tutorials/gson-mapping-of-nested-objects

【讨论】:

【参考方案2】:

改变 playerModel.setDate(dataobj.getString("date"));playerModel.setDate(date);

【讨论】:

我知道。它应该是dataobj "date" 对象应分配外部数组,如 json 数据所示。【参考方案3】:

VipPojo 中的“日期”字段不是静态的

【讨论】:

有什么区别,模型对象无论如何都在这个循环中初始化。但是我已经尝试过了,但没有成功。 我打印 dataModelArrayList: for (VipPojo vp: dataModelArrayList) Log.d("gggggg", vp.date); 结果:2019 年 8 月 1 日星期四 2019 年 8 月 1 日星期四 2019 年 8 月 2 日星期五 2019 年 8 月 2 日星期五 2019 年 8 月 5 日星期一【参考方案4】:

你可以这样试试

VipPojo playerModel;
try 
    JSONArray dataArray = obj.getJSONArray("data");
    for (int i = 0; i < dataArray.length(); i++) 
    playerModel = new VipPojo();
        JSONObject dataobj = dataArray.getJSONObject(i);
        JSONArray dataArrays1 = dataobj.getJSONArray("time");
        String date = dataobj.getString("date");
        System.out.println("date: " + date); // here I get correct data (all 3 items);
        playerModel.setDate(date);
        for (int j = 0; j < dataArrays1.length(); j++) 

            JSONObject dataobj1 = dataArrays1.getJSONObject(j);
             // this is adding same previous assigned "date" until loop ends(I get 5 data with duplicate values)
            playerModel.setTimes(dataobj1.getString("times"));
            playerModel.setNotice(dataobj1.getString("notice"));
            playerModel.setCategory(dataobj1.getString("category"));
            dataModelArrayList.add(playerModel);
        
    
 catch (JSONException e) 
    e.printStackTrace();

【讨论】:

以上是关于遍历嵌套的 json 数组正在将先前分配的值添加到数据模型的主要内容,如果未能解决你的问题,请参考以下文章

将先前查询的值访问到新的嵌套查询 laravel

将 Json 数组嵌套到对象

怎么将json对象添加进json数组中

将项目添加到数组(状态)并且它正在更新状态中的先前记录

如何从嵌套 Json 数组角度 2 打印和分离键和值并将其添加到选择框中

java中把json怎么转换成数组