본문 바로가기

카테고리 없음

브롤스타즈 전투기록 JSON Parsing 하기 (Java)

브롤스타즈 개발자 사이트에서 battleLog를 가져오는 API를 호출해보고 어떤 JSON 포맷으로 가지고 오는지 확인한다.

developer.brawlstars.com/

 

Brawl Stars API

Let's get constructive with the Brawl Stars API! Build amazing experiences with access to accurate and secure game data.

developer.brawlstars.com

#9QU209UTC 플레이어의 전투기록을 가져왔다.

items 라는 field에 List의 형태로 각 전투기록들이 들어오는 것을 확인할 수 있다. 

먼저 Request를 보내어 String 형태로 가져온다.

public class APITest {
	@Test
	public void getBattleLog() {
		String baseUrl = "https://api.brawlstars.com/v1/players/";
		String tag = "#9QU209UYC";
		tag = tag.replace("#", "%23");
		try {
			URL url = new URL(baseUrl + tag + "/battlelog");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();

			String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6IjI4YTMxOGY3LTAwMDAtYTFlYi03ZmExLTJjNzQzM2M2Y2NhNSJ9.eyJpc3MiOiJzdXBlcmNlbGwiLCJhdWQiOiJzdXBlcmNlbGw6Z2FtZWFwaSIsImp0aSI6IjAzM2YwNDRmLTIzZTUtNGJhZC04ZDdhLWVlODgzOTk0NDIyMSIsImlhdCI6MTYxNDA5Mzc2NSwic3ViIjoiZGV2ZWxvcGVyLzRmODljMjEyLWE0OWYtZWRiZS0zZjgzLTRhODJiZGE2N2NiNSIsInNjb3BlcyI6WyJicmF3bHN0YXJzIl0sImxpbWl0cyI6W3sidGllciI6ImRldmVsb3Blci9zaWx2ZXIiLCJ0eXBlIjoidGhyb3R0bGluZyJ9LHsiY2lkcnMiOlsiNTguMTQzLjIwNi40MSJdLCJ0eXBlIjoiY2xpZW50In1dfQ.YknOO4aOE7OxNQ1SWZ-ojAp73SqDMXxiA-hyUzHnPcF36HiOQeFPUgHMv6LmHEA8YwWiSL-tWBRRfZZAZvrA6g";
			conn.setRequestProperty("Authorization", "Bearer " + token);
			conn.setRequestMethod("GET");

			BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			String output;

			StringBuffer response = new StringBuffer();

			while ((output = in.readLine()) != null) {
				response.append(output);
			}
			in.close();

			System.out.println("Response: " + response.toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

테스트 코드 실행 결과

출력 결과를 확인해보니 정상적으로 수신해왔다는 것을 알 수 있다.

자 이제 jackson databind 라이브러리를 이용해 전투기록들을 자바 객체로 Parsing 해야한다.

튜토리얼 코드를 참고해보니, ObjectMapper 클래스의 readValue method에 Return Class를 매개변수로 넣어서 넘겨주면 알아서 파싱이 되는 것을 알 수 있다.

ObjectMapper objectMapper = new ObjectMapper();

String carJson =
    "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";

try {
    Car car = objectMapper.readValue(carJson, Car.class);

    System.out.println("car brand = " + car.getBrand());
    System.out.println("car doors = " + car.getDoors());
} catch (IOException e) {
    e.printStackTrace();
}

jackson databind sample code

출처 : tutorials.jenkov.com/java-json/jackson-objectmapper.html

 

Jackson ObjectMapper

The Jackson ObjectMapper can read JSON into Java objects and write Java objects to JSON. This Jackson ObjectMapper tutorial explains how to use the Jackson ObjectMapper class.

tutorials.jenkov.com

기본적으로 json의 field와 이름이 동일한 Java Class Member에 set이 되며, 해당 Member 이름과 매칭이 되는 getter와 setter가 존재하여야 한다. 만약 다른 이름으로 사용하고 싶다면, @JsonProperty 어노테이션을 사용하여 매핑되는 json field의 이름을 달리 지정해줄 수 있다.

items에는 battleLog, event와 같은 field들이 있으므로, Item Class를 만들어서 이름을 동일하게 세팅해주면 된다. Lombok의 @Data annotation을 이용해 getter와 setter 바로 만들어주어 불필요한 코드 작성을 없앤다.

/* BattleLog.java : items를 매핑하는 최상위 Object */
@Data
public class BattleLog {
	List<Item> items;
	Paging paging;
}

 

/* Item.java */
@Data
public class Item {
	String battleTime;
	Event event;
	Battle battle;
}

위와 같이 Json field와 매칭되는 Class들을 만들어주며 가져온 전투기록을 가져올 수 있도록 세팅한다.

테스트 코드에 JSON을 Parsing 하는 코드를 넣고, 우선 Debug를 이용해 값을 확인해본다.

public class APITest {
	@Test
	public void getBattleLog() {
		String baseUrl = "https://api.brawlstars.com/v1/players/";
		String tag = "#9QU209UYC";
		tag = tag.replace("#", "%23");
		try {
			URL url = new URL(baseUrl + tag + "/battlelog");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();

			String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6IjI4YTMxOGY3LTAwMDAtYTFlYi03ZmExLTJjNzQzM2M2Y2NhNSJ9.eyJpc3MiOiJzdXBlcmNlbGwiLCJhdWQiOiJzdXBlcmNlbGw6Z2FtZWFwaSIsImp0aSI6IjAzM2YwNDRmLTIzZTUtNGJhZC04ZDdhLWVlODgzOTk0NDIyMSIsImlhdCI6MTYxNDA5Mzc2NSwic3ViIjoiZGV2ZWxvcGVyLzRmODljMjEyLWE0OWYtZWRiZS0zZjgzLTRhODJiZGE2N2NiNSIsInNjb3BlcyI6WyJicmF3bHN0YXJzIl0sImxpbWl0cyI6W3sidGllciI6ImRldmVsb3Blci9zaWx2ZXIiLCJ0eXBlIjoidGhyb3R0bGluZyJ9LHsiY2lkcnMiOlsiNTguMTQzLjIwNi40MSJdLCJ0eXBlIjoiY2xpZW50In1dfQ.YknOO4aOE7OxNQ1SWZ-ojAp73SqDMXxiA-hyUzHnPcF36HiOQeFPUgHMv6LmHEA8YwWiSL-tWBRRfZZAZvrA6g";
			conn.setRequestProperty("Authorization", "Bearer " + token);
			conn.setRequestMethod("GET");

			BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			String output;

			StringBuffer response = new StringBuffer();

			while ((output = in.readLine()) != null) {
				response.append(output);
			}
			in.close();

			System.out.println("Response: " + response.toString());

			ObjectMapper mapper = new ObjectMapper();

			BattleLog battleLog = mapper.readValue(response.toString(), BattleLog.class);

			List<Item> items = battleLog.getItems();

			items.stream().forEach(item -> {
				System.out.println(item.getBattleTime());

			});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

정상적으로 값들을 가져왔음을 알 수 있다

items와 하위의 battle, teams 까지 전부 잘 가져온 것을 확인할 수 있었다. jackson databind 가 쉽고 간편하게 Parsing을 해주어 빠르게 해결할 수 있었다.

반응형