使用 Gson 访问 Json 中的嵌套列表

Accessing nested Lists in Json with Gson

您好,我目前正在尝试使用 gson 访问 json 文件,但是当它们嵌套到列表中时我无法读取值,我能够读取外部列表和值但无法读取嵌套在 pos

中的 drive

我的 json 文件看起来像这样

{
    "pos":[
       {
         "x": 1.0,
         "y": 1.0,
         "theta": 1.0,
         "drive":[{
            "p": 1.0,
            "i": 0.5
         }]
       },
       {
         "x": 2.0,
         "y": 2.0,
         "theta": 2.0,
         "drive":[{
            "p": 1.0,
            "i": 0.5
         }]
          
       },
       {
         "x": 3.0,
         "y": 3.0,
         "theta": 3.0,
         "drive":[{
            "p": 1.0,
            "i": 0.5
         }]
          
       }
    ]
 }
 

我可以获得所有 x, y, and theta values inside pos 但是当我尝试访问 drive 中的嵌套值时我得到一个空指针异常

Exception in thread "main" java.lang.NullPointerException
        at frc.robot.files.take2.JsonManager.main(JsonManager.java:63)

这就是我循环检索值的方式 请注意我排除了 setter 和列表中值的吸气剂

    @SerializedName("pos")
    private List<PosData> pos = null;

    public List<PosData> getPositions() {
        return pos;
    }
    public void setPositions(List<PosData> pos) {
        this.pos = pos;
    }

    @SerializedName("drive")
    private List<PidData> drive = null;

    public List<PidData> getDrive() {
        return drive;
    }
    public void setDrive(List<PidData> drive) {
        this.drive = 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<PidData> driveList = manager.getDrive();
        // List<List<Double>> driveList = new ArrayList<>();
        List<Double> drivePID = new ArrayList<>();
        //make parent list list for drivePID that isnt driveList

        System.out.println(drivePID);

        for (PosData pos : posList) {
            xList.add(pos.getX());
            yList.add(pos.getY());
            thetaList.add(pos.getTheta());
            for(PidData pid : driveList){
                drivePID.add(pid.getP());
            }

        }

        System.out.println(xList);
        System.out.println(yList);
        System.out.println(thetaList);
        System.out.println(drivePID);
    }

我仔细检查了它们在未嵌套时是否正常工作,方法是将我的驱动器列表放在 json 文件中并尝试读取其值

{
   "drive":[{
      "p": 1.0,
      "i": 0.5
   }]
 }
 
for(PidData pid : driveList){
   drivePID.add(pid.getP());
}

提前感谢您的帮助!

我认为直接在 JsonManager 中解析 List<PidData> 行不通。您应该将其包含在 PosData 中并将 driveList 更改为 pos.getDrive()

public class JsonManager {
    @SerializedName("pos")
    private List<PosData> pos = null;

    public List<PosData> getPositions() {
        return pos;
    }
    public void setPositions(List<PosData> pos) {
        this.pos = pos;
    }
}


public class PosData {
    private Double x;
    private Double y;
    private Double theta;
    // @SerializedName("drive")
    private List<PidData> drive = null;
    
    // your getter/setter
}
            for(PidData pid : pos.getDrive()){
                drivePID.add(pid.getP());
            }