2016-04-25 5 views
0

Мне пришлось программировать небольшую игру на Java для проекта для школы. Игра RushHour, и вы можете увидеть ее пример: http://www.thinkfun.com/play-online/rush-hour/.Как использовать вывод JSON-файла в Java для создания объекта с ним?

Мои преподаватели спрашивают меня, разрешите ли мой код читать внешний файл, чтобы исходное состояние игры больше не было жестко закодировано в моей основной части и чтобы параметры игры можно было настроить (размер доска, количество машин в игре ...)

Вот мой первый JSON-файл, который устанавливает классическую игру.

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

}

Я пытаюсь найти, как прочитать файл и повторно использовать это выход для создания объекта RushHourGame. Вот конструктор.

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

Я попытался использовать BufferedReader, как это.

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

Но я не знаю, как использовать его для разбора моего файла JSON. Кто-нибудь может мне помочь?

ответ

0

Несколько ответов на ваш вопрос можно найти here. Я предпочитаю ответ предоставленный StaxMan:

Самый простой вариант является Jackson:

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

Приведенный выше код должен автоматически обрабатывать объект JSON/Java связывание, используя POJO, Java приводится ниже:

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

Примечание: Я переименовал переменную «char» в классе Car в «charr», потому что char является зарезервированным ключевым словом Java. Надеюсь, вы сочтете это полезным!

+0

Спасибо за ответ. Ваш ответ выглядит очень интересным, я проверю это подробно, как только смогу, и я вернусь, чтобы связаться с вами, если это сработает! –

+0

Ну, я думаю, что код не очень полезен, потому что я уже сделал свои занятия для автомобиля, борта, должности ... И то, что вы сделали, не подходит. Плюс, я думаю, что использование сеттеров не является решением, потому что я не хочу, чтобы у пользователя была возможность изменить эти значения. Конструктор класса RushHourGame вызывает cnstructor всех других классов, поэтому мне нужен конструктор RushHourGame для извлечения данных и значений в файле JSON и создания с ним нового объекта RushHourGame. Но спасибо за решение Джексона. –