2017-07-06 107 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.