2017-07-06 4 views
0

Das erste Mal, dass ich json Parsing in meinem LibGDX-Projekt und ich bin nicht in der Lage, die geparsten Ergebnisse richtig zu bekommen.Mapping geparsten JSON zu Java-Objekt funktioniert nicht LibGdx

Hier möchte ich die Hindernisse mit Eigenschaften verwalten: Name, Richtung, Abstand und Geschwindigkeit.

Ich habe eine JSON-Datei wie folgt aus:

"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"}, 

], 

und ich lese das Array wie folgt:

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; 
    } 

} 

Arrays werden in konstanten Klasse wie folgt definiert:

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; 

Ich möchte den geparsten JSON auf das Objekt bear.For, das habe ich wie folgt:

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; 
} 
} 

Aber wenn ich diese createBear() -Methode aufrufen und diesen Code ausführen, es wirft IndexOutOfBoundsException in dieser Zeile:

bear.setDirection(Constants.obsArray.get(Constants.OBS_COUNT)); 

Analysierte Werte korrekt in der Konsole angezeigt werden.

Welchen Fehler habe ich hier gemacht?

Antwort

0

Ihre Konstanten scheinen keine Konstanten zu sein, da sie sich ändern können. Ich fand das merkwürdig, und als nächstes beiseite, ist der Code ziemlich verwirrend zu folgen. Ich bin mir nicht ganz sicher, was Sie erreichen wollen.

Aber der Index Fehler wird wahrscheinlich durch Inkrementierung Ihrer Konstante verursacht (Hinweis, keine Konstante, oder?) Constants.OBS_COUNT ++; in der readJson-Methode. Wenn Sie Ihre json-Datei übergeben, könnte OBS_COUNT 5 sein, daher ist Constants.obsArray.get (Constants.OBS_COUNT) fehlgeschlagen, da Ihr Array nur die Indexpositionen 0 bis 4 hat.