본문 바로가기

Trouble-Shooting

JAVA - JSON(String) to JSON : JSONObject

728x90

이 글은 Java Spring 및 Riot API를 사용해 '리그오브레전드 전적 검색 토이 프로젝트'를 하며

마주했던 문제점, 힘들었던 점들을 해결한 것에 대한 회고이다.

 

🤔 문제점

Riot API의 MATCH-V5를 통해 내 계정의 게임 전적에 대한 MATCH-ID 값들을 받았고

이 ID값들로 다시금 HttpRequest GET 쿼리를 날려 HttpResponse로 받았고 내가 원하는

각각의 매칭 게임의 세부 데이터들을 꺼내오기 위해 httpresponse.body()를 사용하여

String 형식의 JSON 데이터를 가져올 수 있었다. 

이게 무슨 말이냐 하면 JSON데이터가 쌍따옴표로 둘러쌓인 "JSON" 인 것이다.

 

이런 느낌..

 

요 String 데이터 내에 있는 데이터들을 정규표현식을 사용해서 뽑아올까 싶었지만

전적 사이트를 구성하기 위해 뽑아와야 할 데이터들이 한둘이 아닌지라 

String -> JSON 으로 변환하고 key를 통해 value에 접근하여 데이터들을 뽑아오자고 생각했다.

 

✅ 해결 방법

 

String to JSON은 JSONObject 를 이용하여 간단하게 변환할 수 있었다. 

단, JSONObject를 사용하기 위해 build.gradle에 'org.json' Dependency를 등록해야한다.

 

// String 형식의 JSON을 JSONObject의 파라미터로 넣어주면 된다

JSONObject matchData = new JSONObject(result);

 

위 방법대로라면 내가 넣은 String 형식의 result가 HashMap 형태로 바뀌었을 것이다.

이는 JSONObject 클래스가 내부적으로 HashMap을 사용하여 key-value 쌍으로 JSON 데이터를

다루기 때문이다.

 

 

JSONObject 클래스를 뒤져본 결과 생성자 중 String 파라미터를 JSONObject에 집어넣었을 때

파라미터를 HashMap 형식으로 변환하는 생성자가 있었다. 

파라미터의 String... 은 names 매개변수가 몇개가 올지 모르기 때문에 전부 받겠다 라는 의미이며

String[ ] 와 같은 의미라고 하더라. 이외에도 HashMap을 파라미터로 받아

HashMap to JSON도 가능하다.

 

JSONObject로 변환된 JSON객체의 구조는 Map 내의 Map 내의 Map... 과 같았다.

 

 

JSON 변환 이후에 데이터에 접근하고자 한다면 Map에서 했던 것 처럼

map.get("key")를 이용해 접근할 수 있다. 내가 받은 데이터인 matchData 내에는 size = 2짜리 map이 있었으며

매칭게임의 메타데이터를 담은 metadata와 게임 정보가 담긴 info가 있었고

아무래도 필요한 정보들이 info쪽에 많이 있어서 info를 get하여 가져오기로 했다.

 

 

처음에 한 것과 마찬가지로 info를 get한뒤 toString으로 변환하고 JSONObject 클래스에 

파라미터로 넘겨주었다. 이제 info 내에서 필요한 데이터들을 key를 통해 추출할 수 있다.

가장 최근에 한 게임의 게임 모드와 게임 시간을 추출해보도록 하자

 

가장 최근 게임

 

가장 최근에 한 게임은 무작위총력전 모드이며 총 플레이타임은 14분 2초이다.

 

 

무작위 총력전의 영어 약자인 ARAM (All Random All Mid) 과 

전체 플레이타임을 초 단위로 나타내는 842 ( 842 / 60 = 14분, 나머지 = 2초) 가

get("gameMode")와 get("gameDuration")으로 잘 추출되는 것을 볼 수 있다.

 

 

이것으로 필요한 데이터들을 추출하여 전적 검색 사이트를 채울 수 있겠다.

728x90
반응형