使用Gson访问JSON中pos列表内嵌套的drive字段时出现空指针异常
问题原因
你把drive字段的定义放错了类:你当前把@SerializedName("drive")对应的List<PidData>定义在了根类JsonManager里,但你的JSON结构中drive是嵌套在pos数组的每个子对象里的,不属于根对象的直接字段,所以manager.getDrive()返回的永远是null,遍历的时候自然抛出空指针异常。你之前测试drive放在JSON根目录下能正常运行,就是因为那时候drive字段属于根对象,和你定义在JsonManager类里的字段能对应上,现在层级变了,字段的所属类也要对应调整。
修复步骤
- 把
drive相关的字段、getter、setter从JsonManager类中移除,移动到PosData类中:
// 以下代码属于PosData类 @SerializedName("drive") private List<PidData> drive = null; public List<PidData> getDrive() { return drive; } public void setDrive(List<PidData> drive) { this.drive = drive; }
- 修改取值逻辑,在遍历
PosData的时候从当前的pos对象中获取drive列表,而不是从根对象获取:
JsonManager manager = new Gson().fromJson(json, new TypeToken<JsonManager>() {}.getType()); List<PosData> posList = manager.getPositions(); List<Double> xList = new ArrayList<>(); List<Double> yList = new ArrayList<>(); List<Double> thetaList = new ArrayList<>(); List<Double> drivePID = new ArrayList<>(); for (PosData pos : posList) { xList.add(pos.getX()); yList.add(pos.getY()); thetaList.add(pos.getTheta()); // 从当前pos对象获取drive列表 List<PidData> driveList = pos.getDrive(); // 非空判断避免特殊场景空指针 if (driveList != null) { for(PidData pid : driveList){ drivePID.add(pid.getP()); } } } System.out.println(xList); System.out.println(yList); System.out.println(thetaList); System.out.println(drivePID);
内容的提问来源于stack exchange,提问作者moawwad
相关产品推荐
相关产品推荐

