将解析的json映射到不工作的java对象LibGdx

将解析的json映射到不工作的java对象LibGdx,libgdx,Libgdx,第一次在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",

第一次在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;
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;
}
}
我读的数组是这样的:

"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;
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));
已解析的值在控制台中正确显示


我在这里犯了什么错误?

您的常量似乎不是常量,因为它们可以更改。我发现这很奇怪,另一方面,代码很难理解。我不完全确定你想达到什么目的

但是索引错误可能是由于增加常量(提示,不是常量,是吗?)引起的;在readJson方法中。给定json文件,OBS_计数可能最终为5,因此Constants.obsArray.get(Constants.OBS_计数)失败,因为数组的索引位置仅为0到4