java - 使用 Gson 访问 Json 中的嵌套列表
问题描述
嗨,我目前正在尝试使用 gson 访问 json 文件,但是当它们嵌套到列表中时我无法读取值,我能够读取外部列表和值,但无法读取drive
嵌套在其中的值pos
我的 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)
这就是我循环检索值的方式请注意我不包括列表中值的设置器和获取器
@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());
}
提前感谢您的帮助!
解决方案
我不认为List<PidData>
直接解析JsonManager
会起作用。您应该将其包含在您的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());
}
推荐阅读
- php - json_decode foreach 成表
- javascript - 在js中的任何数字之前将字符串分成两部分?
- php - drupal 上的可信主机模式
- python - 为什么在将 __init__.py 添加到 pytest 的测试文件夹后,我能够在调试器中导入模块
- javascript - 将值从脚本放置到 DOM
- google-apps-script - 将值从一张表复制到另一张表
- javascript - 无法在 React 上加载 javascript 组件文件
- rest - 可通过 API 调用访问的加密密码,这安全吗?
- fullcalendar - 如何在 FullCalendar 议程视图中隐藏空行?
- powershell - 单一 SMTP 报告