2016-04-25 21 views
0

Ich musste ein kleines Spiel in Java für ein Projekt für die Schule programmieren. Das Spiel ist RushHour, und Sie können hier ein Beispiel davon sehen: http://www.thinkfun.com/play-online/rush-hour/.Wie verwende ich die Ausgabe einer JSON-Datei in Java, um damit ein Objekt zu erstellen?

Meine Lehrer fragen mich nun, ob mein Code eine externe Datei lesen darf, damit der Grundzustand des Spiels in meinem Hauptprogramm nicht mehr fest codiert ist und die Parameter des Spiels angepasst werden können (die Größe des Board, die Anzahl der Autos im Spiel ...)

Hier ist meine erste JSON-Datei, die ein klassisches Spiel setzt.

{ 
"ClassicBoard" : 
     { 
      "height" : "6", 
      "width" : "6", 
      "exit": 
       { 
        "row" : "2", 
        "column" : "5" 
       } 
     }, 
"ListOfCars" : 
     { 
      "car2" : 
       { 
        "char" : "2", 
        "size" : "3", 
        "orientation" : "vertical", 
        "currentPosition": 
          { 
          "row" : "2", 
          "column": "2" 
          } 
       },    
      "car3" : 
       { 
       "char" : "3", 
       "size" : "3", 
       "orientation" : "vertical", 
       "currentPosition": 
          { 
          "row" : "2", 
          "column": "4" 
          } 
       } 
     }, 
"redCar": 
     { 
     "char" : "1", 
     "size" : "2", 
     "orientation" : "horizontal", 
     "currentPosition": 
      { 
       "row" : "2", 
       "column": "0" 
      } 
     } 

}

Ich versuche zu finden, wie die Datei zu lesen und es ist Ausgang für die Schaffung eines RushHourGame Objekt wieder zu verwenden. Hier ist der Konstruktor.

public RushHourGame(Board board, List <Car> cars, Car redCar) throws RushHourException 
{ 
    this.board = board; 
    this.redCar = redCar; 

    if(((redCar.getOrientation() == Orientation.HORIZONTAL) 
      && (board.getExit().getRow() != redCar.getCurrentPosition().getRow())) 
      || (((redCar.getOrientation() == Orientation.VERTICAL) 
      && (board.getExit().getColumn() != redCar.getCurrentPosition().getColumn())))) 
    { 
     throw new RushHourException("Car must be aligned with the exit, " 
       + "a default game has been created"); 
    } 
    board.put(redCar); 
    for (Car putCars : cars) 
    { 
     board.put(putCars); 
    } 
} 

Ich habe versucht, einen BufferedReader, wie folgt zu verwenden.

public static String readFile(String filename) 
{ 
    String result =""; 
    try 
    { 
     BufferedReader br = new BufferedReader (new FileReader(filename)); 
     StringBuilder sb = new StringBuilder(); 
     String line = br.readLine(); 
     while (line != null) 
     { 
      sb.append(line); 
      line = br.readLine(); 
     } 
     result = sb.toString(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return result; 
} 

Aber ich sur bin nicht, wie es für meine JSON-Datei parsen. Jemand kann mir helfen?

Antwort

0

Mehrere Antworten auf Ihre Frage finden Sie here. Ich ziehe es die Antwort von StaxMan zur Verfügung gestellt:

Die einfachste Option ist Jackson:

MyObject ob = new ObjectMapper().readValue(jsonString, RushHourState.class); 

Der obige Code sollte das JSON/Java-Objekt zu binden, unter Verwendung der Java POJOs bereitgestellt unten automatisch handhaben:

public class RushHourState { 
    private ArrayList<Car> listOfCars; 
    private ClassicBoard classicBoard; 
    private Car redCar; 

    public ArrayList<Car> getListOfCars() { 
     return listOfCars; 
    } 
    public void setListOfCars(ArrayList<Car> listOfCars) { 
     this.listOfCars = listOfCars; 
    } 
    public ClassicBoard getClassicBoard() { 
     return classicBoard; 
    } 
    public void setClassicBoard(ClassicBoard classicBoard) { 
     this.classicBoard = classicBoard; 
    } 
    public Car getRedCar() { 
     return redCar; 
    } 
    public void setRedCar(Car redCar) { 
     this.redCar = redCar; 
    } 
} 

// --------------------------------------------------- 

public class ClassicBoard { 
    private int height; 
    private int width; 
    private HashMap<String, String> exit; 
    public int getHeight() { 
    return height; 
    } 
    public void setHeight(int height) { 
    this.height = height; 
    } 
    public int getWidth() { 
    return width; 
    } 
    public void setWidth(int width) { 
    this.width = width; 
    } 
    public HashMap<String, String> getExit() { 
    return exit; 
    } 
    public void setExit(HashMap<String, String> exit) { 
    this.exit = exit; 
    } 
} 

// --------------------------------------------------- 

public class Car { 
    private int charr; 
    private int size; 
    private String orientation; 
    private HashMap<String, String> currentPosition; 
    public int getCharr() { 
     return charr; 
    } 
    public void setCharr(int charr) { 
     this.charr = charr; 
    } 
    public int getSize() { 
     return size; 
    } 
    public void setSize(int size) { 
     this.size = size; 
    } 
    public String getOrientation() { 
     return orientation; 
    } 
    public void setOrientation(String orientation) { 
     this.orientation = orientation; 
    } 
    public HashMap<String, String> getCurrentPosition() { 
     return currentPosition; 
    } 
    public void setCurrentPosition(HashMap<String, String> currentPosition) { 
     this.currentPosition = currentPosition; 
    } 
} 

Hinweis: Ich habe die Variable 'char' in der Klasse 'Car' in 'charr' umbenannt, da char ein reserviertes Java-Schlüsselwort ist. Hoffe, du findest das hilfreich!

+0

Danke für die Beantwortung. Ihre Antwort sieht sehr interessant aus, ich werde das im Detail überprüfen, sobald ich kann und ich komme zurück, um Ihnen mitzuteilen, ob es funktioniert! –

+0

Nun, ich denke, dass der Code nicht sehr hilfreich ist, weil ich meine Klassen für Auto, Brett, Position schon gemacht habe ... Und was Sie gemacht haben, passt nicht damit. Außerdem denke ich, dass die Verwendung von Setter nicht die Lösung ist, weil ich nicht möchte, dass der Benutzer die Möglichkeit hat, diese Werte zu ändern. Der Konstruktor der Klasse RushHourGame ruft den cnstructor aller anderen Klassen auf, daher brauche ich nur den Konstruktor von RushHourGame, um die Daten und Werte in der JSON-Datei abzurufen und ein neues RushHourGame-Objekt damit zu erstellen. Aber danke für die Jackson-Lösung. –