브롤스타즈 개발자 사이트에서 battleLog를 가져오는 API를 호출해보고 어떤 JSON 포맷으로 가지고 오는지 확인한다.
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
기본적으로 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을 해주어 빠르게 해결할 수 있었다.