使用 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());
}
您好,我目前正在尝试使用 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());
}