我第一次在我的 LibGDX 项目中使用 json 解析,但我无法正确获得解析的结果。
在这里,我想用属性管理障碍;名称,方向,间隙和速度。
我有一个这样的 json 文件:
"obstacles": [
{"name":"eagle","dir":"up","gap":"100","speed":"0"},
{"name":"bigbird","dir":"up","gap":"200","speed":"0"},
{"name":"elephant","dir":"middle","gap":"300","speed":"0"},
{"name":"tiger","dir":"middle","gap":"400","speed":"0"},
{"name":"bear","dir":"down","gap":"500","speed":"0"},
],
我正在像这样阅读数组:
public class ReadJson {
static int levelNum = 0;
public ReadJson()
{
}
public static synchronized ArrayList<String> loadLevelJson(int levelno, String name) {
ArrayList obs = new ArrayList<String>();
JsonValue jsonValue = new JsonReader().parse(Gdx.files.internal("levels/level1.json"));
JsonValue objList = jsonValue.get(name);
System.out.println("name:" + objList);
if (name.equals("obstacles")) {
Constants.OBS_COUNT = 0;
for (JsonValue values : objList.iterator()) // iterator() returns a
// list of children
{
obs.add(values.getString("dir"));
Constants.OBS_POSITION[obs.size() - 1] = Integer.parseInt(values.getString("gap"));
Constants.OBS_NAME[obs.size() - 1] = values.getString("name");
Constants.OBS_SPEED[obs.size() - 1] = Integer.parseInt(values.getString("speed"));
Constants.OBS_COUNT++;
}
}
else if (.....)) {
//code
}
return obs;
}
}
数组在常量类中定义,如下所示:
public static int OBS_COUNT =20;
public static int[] OBS_POSITION= new int[50];
public static String[] OBS_NAME= new String[50];
public static int[] OBS_SPEED= new int[50];
public static ArrayList<String> obsArray;
我想将解析的 json 映射到对象熊。为此,我这样做:
private ReadJson readJson;
public ObsObjectFactory() {
readJson = new ReadJson();
readJson.loadLevelJson(1,"obstacles");
Constants.obsArray=readJson.loadLevelJson(1,"obstacles");
}
public Bear createBear() {
Bear bear = new Bear();
bear.setName(Constants.OBS_NAME[Constants.OBS_COUNT]);
bear.setDirection(Constants.obsArray.get(Constants.OBS_COUNT));
bear.setSpeed(Constants.OBS_SPEED[Constants.OBS_COUNT]);
bear.setGap(Constants.OBS_POSITION[Constants.OBS_COUNT]);
bear.setPosition(Constants.EAGLE_X,Constants.EAGLE_Y);
bear.setSize(Constants.BEAR_WIDTH,Constants.BEAR_HEIGHT);
return bear;
}
}
但是当我调用这个createBear()方法并运行这段代码时,它会在以下行中抛出IndexOutOfBoundsException:
bear.setDirection(Constants.obsArray.get(Constants.OBS_COUNT));
解析的值在控制台中正确显示。
我在这里犯了什么错误?
你的常量似乎不是常量,因为它们可以改变。我发现这很奇怪,另一方面,代码非常令人困惑。我不完全确定你想实现什么。
但是索引错误可能是由增加常量引起的(提示,不是常量,是吗?Constants.OBS_COUNT++;在 readJson 方法中。给定您的 json 文件,OBS_COUNT最终可能是 5,因此 Constants.obsArray.get(Constants.OBS_COUNT) 失败,因为您的数组只有索引位置 0 到 4。