2017-07-06 106 views
0

第一次我在我的LibGDX项目中使用json解析,并且我无法正确获取解析的结果。将解析的json映射到Java对象不工作 - LibGdx

在这里,我想管理的属性,名称,方向,差距和速度的障碍。

我有一个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)); 

解析的值在控制台中正确显示。

我在这里做了什么错误?

回答

0

你的常量似乎不是常量,因为它们可以改变。我发现这个代码很奇怪,而且另一方面,代码相当混乱。我不完全确定你想要达到的目标。

但是,索引错误可能是由你的常量增加引起的(提示,而不是一个常量,是吗?)Constants.OBS_COUNT ++;在readJson方法中。鉴于你的json文件,OBS_COUNT可能最终为5,所以Constants.obsArray.get(Constants.OBS_COUNT)失败,因为你的数组只有索引位置0到4.