ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Tetris] ObjectMapper
    Java 2022. 4. 30. 19:34

     

    기존에는 Tetris 게임의 scoreboard 처리를 txt 파일 I/O로 처리했었다.

    하지만 이 방식이 project를 jar 파일로 만들고 나면 잘 작동하지 않는다는 것을 알게된 후 JSON 파일로 바꾸기로 결심했다.

    바뀌는 점을 최소화하기 위해 기존 클래스의 함수 이름을 그대로 사용했다.

     

     

    JSON(Javascript Object Notation)

    "키:값" 쌍으로 이루어진 데이터 객체를 전달하기 위해 사람이 읽을 수 있는 텍스트를 사용하는 포맷

     

    직렬화(Serialize): 객체들을 문자열로 바꾸어주는것, Object -> String

    역직렬화(Deserialize): 데이터가 모두 전송된 이후 문자열을 기존의 객체로 회복시켜주는 것 String -> Object

     

    ObjectMapper: JSON 컨텐츠를 Java 객체로 deserialization 하거나 Java 객체를 JSON으로 serialization 할 때 사용하는 Jackson 라이브러리 클래스

     

     

    1. 우선 Score class를 만들어서 object로 score을 처리할 수 있도록 했다.

     

    이때 getter와 default 생성자가 있어야한다.

    public class Score {
        protected String name;
        protected Integer score;
        protected String level;
        protected String mode;
    
        public Score() { //Default
            this.name = "DF";
            this.score = 0;
            this.level = "normal";
            this.mode = "regul";
        }
    
        public String getName(){
            return name;
        }
        public Integer getScore(){
            return score;
        }
        public String getLevel(){
            return level;
        }
        public String getMode(){
            return mode;
        }
    
        public Score(String name, Integer score, String level,String mode) {
            this.name = name;
            this.score = score;
            this.level = level;
            this.mode = mode;
        }
    
        public String toWritableString(){
            return "|   " + String.format("%-4s", this.name) + "   "
                    + String.format("%05d", this.score) + "   " + String.format("%-7s", this.level)
                    + String.format("%7s", this.mode) + "\n";
        }
    
    }
    class ScoreComparator implements Comparator<Score> {
        public int compare(Score arg0, Score arg1) {
            return arg1.score.compareTo(arg0.score);
        }
    }

     

     

    2. Java 객체를 JSON으로 직렬화 하기 위해 ObjectMapper의 writeValue() 함수를 사용한다.

     

    scoreBoard를 처리하기 위한 Java 클래스를 하나 만들었다.

     

    private List<Score> list;
    private ObjectMapper mapper = new ObjectMapper()
          .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    

    여러개의 값을 가져오기 위해 List를 사용했고 새로운 값을 추가할 때 List에는 add가 되지 않아 ArrayList를 사용했다.

    또한 Scoreboard 처리를 위해 sort 하고 현재 추가된 값의 list에서의 위치를 반환했다.

    사실 쓸데 없이 리스트를 두 개 쓴거 같아서 이 부분은 수정이 필요할 것 같다.

     

    public int writeScoreBoard(String name, int score, String level, String mode) throws IOException {
    	Score p = new Score(name,score,level,mode);
    	ArrayList<Score> List = new ArrayList<Score>(list);
    	List.add(p);
        
    	try {
    		mapper.writeValue(new File("scoreBoardFile.json"), List);
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
        
    	list = Arrays.asList(mapper.readValue(new File("scoreBoardFile.json"), Score[].class));
    	Collections.sort(List, new ScoreComparator());
    	Collections.sort(list, new ScoreComparator());
    	int index = List.indexOf(p);
    
    	return index;
    }

     

     

    3. JSON -> java Object

     

    readValue 함수를 사용해서 JSON 파일의 값을 Java 객체로 가져온다.

     

    public void getScoreBoard() throws IOException {
       list = Arrays.asList(mapper.readValue(new File("scoreBoardFile.json"), Score[].class));
       Collections.sort(list, new ScoreComparator());
    }

     

    잘 작동한다.

     

    참고

    https://escapefromcoding.tistory.com/341

    https://velog.io/@zooneon/Java-ObjectMapper를-이용하여-JSON-파싱하기

     

    'Java' 카테고리의 다른 글

    [Tetris] Automator  (0) 2022.05.02
    [Java] 유닛테스트 작성하기  (0) 2022.04.26
    [Java] 화면 전환, 애니메이션 (Hangman5)  (0) 2022.02.09
    [Java] button, textField CSS (Hangman4)  (0) 2022.02.09
    [Java] Dictionary API (Hangman3)  (0) 2022.02.06

    댓글

Designed by Tistory.