λ‘€ μ μ κ²μ μ¬μ΄νΈλ₯Ό λ§λ€κΈ° μν΄ Riot Api
λ₯Ό λ°μμμ Java
κ°μ²΄μ 맀νμν€λ μμ
μ νλ μ€, Response body λ‘ λμ΄μ¨ JSON
μλ΅ λ°μ΄ν°μ μνκ° μ¬μμΉ μμ κ²μ λ°κ²¬νμ΅λλ€.
"info": {
"gameCreation": 1662939391488,
"mapId": 11,
"participants": [
{
"assists": 3,
"baronKills": 0,
"basicPings": 1,
"bountyLevel": 0,
"challenges": {
"12AssistStreakCount": 0,
"abilityUses": 220,
},
"champExperience": 14906,
"champLevel": 16,
"perks": {
"statPerks": {
"defense": 5003,
"flex": 5008,
"offense": 5005
},
"styles": [
{
"description": "primaryStyle",
"selections": [
{
"perk": 8010,
(λ²μ¨ μ΄μ§λ½λ€)
κ²μμ μ 보λ₯Ό κ°μ Έμ€λ Match-V5
api μ (κ·Ήν)μΌλΆμΈλ°, JSON
μ€λΈμ νΈ μμ μ€μ²©λ κ°μ²΄μ JSON
λ°°μ΄μ΄ λ무 λ§μ΅λλ€. μλ§λ νλμ κ²μμ ν¬ν¨λ μ λ³΄κ° λ무 λ§μμ κ·Έλ° λ―ν©λλ€. λ°μ΄ν°λ₯Ό μ½μ΄λ³΄λ©΄ μ¨κ° μμ§κ΅¬λ ν μ 보κΉμ§ μ£Όμ΄μ§λλ€.
μ΄ μλ΅μ μ΄λ»κ² νλ©΄ Java
κ°μ²΄μ 맀νμ μν¬κΉλ₯Ό 곡λΆνλ€κ° κΈ°λ‘κ²Έ ν¬μ€νΈλ₯Ό μμ±νκ² λμμ΅λλ€. κ°λ¨ν μμλ‘ μμλ΄
μλ€.
{
"nation": "Korea",
"name": "Minsu",
"address": {
"city": "Seoul",
"gu": "Songpa",
"apart": {
"apartName": "JsonApart",
"dong": "101",
"ho": "1501"
}
}
}
νκ΅μ μ¬λ λ―Όμμ μ£Όμ μ 보λ₯Ό 보λ΄μ£Όλ Json
λ°μ΄ν°μ
λλ€. λ―Όμλ μμΈμ μ‘νꡬμ Json μννΈ 101λ 1501νΈμ μ΄κ³ μλ€μ.
보μλ€μνΌ μ΄ JSON
μ 2λ 벨 κΉμ΄μ μ€μ²©λ JSON
μΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€. μ΄ JSON
λ°μ΄ν°λ₯Ό λ°μμ λ€μμ Java
κ°μ²΄λ‘ 맀νμν€κ³ μΆμ΅λλ€.
public class Person {
private String nation;
private String name;
private String city;
private String apartName;
}
λ―Όμκ° λ§€νλ Person
ν΄λμ€. κ΅μ , μ΄λ¦, μ΄κ³ μλ λμμ μννΈ μ΄λ¦μ μ μ₯νκ³ μμ΅λλ€.
μ΄λ, JSONμ΄ μ€μ²©λ κΉμ΄μ λ°λΌ Person
μ νλλ€μ λ€μκ³Ό κ°μ΄ λΆλ₯ν μ μμ΅λλ€.
- 0λ 벨 κΉμ΄μ Property
- nation
- name
- 1λ 벨 κΉμ΄μ Property
- city
- 2λ 벨 κΉμ΄μ Property
- apartName
city κ°μ κ²½μ°λ address μμ λ½μλ΄μΌκ² κ³ (1λ 벨 κΉμ΄),
apartName μ μ€μ²©λ apart μμ apartName μ λ½μλ΄λ©΄ λκ² λ€μ(2λ 벨 κΉμ΄).
μ΄μ λΆν° νλ² λ§€νμ μ§νν΄λ΄
μλ€!
맀ννλ λ°©λ²μ μ΄ 3κ°μ§κ° μλλ°μ, λ€μκ³Ό κ°μ΅λλ€.
- μ΄λ Έν μ΄μ μ μ¬μ©ν 맀ν
- JsonNodeλ₯Ό μ¬μ©ν 맀ν
- μ¬μ©μκ° μ μν JsonDeserializerλ₯Ό μ΄μ©ν 맀ν
μ λ μ€λ 1. μ΄λ Έν μ΄μ μ μ¬μ©ν 맀νλ§μ λ€λ£° μμ μ λλ€.
2. JsonNodeλ₯Ό μ¬μ©ν 맀νκ³Ό, 3. μ¬μ©μκ° μ μν JsonDeserializerλ₯Ό μ΄μ©ν 맀νμ ꡬνμ κ΄μ μμλ κ°μ λ‘μ§μ΄λΌλ μΈκΈμ΄ μκ³ , μ λ μΌλ¨ μ΄λ Έν μ΄μ μ μ¬μ©ν 맀νμΌλ‘ ν΄κ²°ν κ²μ΄κΈ°μ...
λ§μ½ μ΄λ
Έν
μ΄μ
μ μ¬μ©ν 맀νλ§μΌλ‘ ν΄κ²°μ΄ λμ§ μκ±°λ, ν μ΄ νλ‘μ νΈλ₯Ό λ§λ¬΄λ¦¬νλ©΄ λ€λ₯Έ ν¬μ€νΈμμ λ€μ νλ² λ€λ£¨μ΄λ³΄λλ‘ νκ² μ΅λλ€.
νΉμ λ€λ₯Έ 맀ν λ°©λ²μ κ΄νμ¬ κ΄μ¬μμΌμ λΆλ€μ
Baeldung μ¬μ΄νΈλ₯Ό μ°Έκ³ νμλ©΄ λκ² μ΅λλ€.
λ¨Όμ , 1λ 벨 κΉμ΄μ city λ₯Ό λ½μλ΄κΈ° μν΄μλ, μ€μ²©λ address μ 보λ₯Ό Map
μΌλ‘ νμ΄λ΄μ΄(unpack), city μμ±μ μΆμΆν΄μΌ ν©λλ€.
λ§μ°¬κ°μ§λ‘, 2λ 벨 κΉμ΄μ apartName λ₯Ό λ½μλ΄κΈ° μν΄μ, μ€μ²©λ apart JSON
κ°μ²΄λ₯Ό Map
μΌλ‘ νμ΄λ΄, apartName μμ±μ μΆμΆν κ²μ
λλ€.
μ€μ²©λ μμ±μ νμ΄λ΄λ λ°©λ²μ, @JsonProperty μ μ½κ°μ λ‘μ§μ Person
ν΄λμ€μ μΆκ°νλ©΄ λ©λλ€. λ§λ‘λ§νλ©΄ μ΄ν΄κ° μ μκ°λ μ½λλ‘ νλ² λ³΄μμ£ .
public class Person {
private String nation;
private String name;
private String city;
private String apartName;
// μλμ κ°μ΄ μΆκ°
@SuppressWarnings("unchecked")
@JsonProperty("address")
private void unpackNested(Map<String,Object> address) {
this.city = (String)address.get("city");
Map<String,String> apart = (Map<String,String>)address.get("apart");
this.apartName = apart.get("apartName");
}
}
μ½λλ₯Ό μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
@SuppressWarnings("unchecked")
μ λ€λ¦μ μ¬μ©νλ κ²½μ°μ, 무μ κ² νλ³νμ νμ μ μ»΄νμΌ κ²½κ³ λ©μΈμ§λ₯Ό λ³΄κ² λ©λλ€. μ ν¬ μ½λμμλ ( Map<String,String> )address.get("apart");
λΆλΆμμ κ²½κ³ λ©μΈμ§κ° λ°μν κ²μ
λλ€. μ΄λ, @SuppressWarings("unchecked") μ΄λ
Έν
μ΄μ
μ ν΅ν΄ κ²½κ³ λ©μΈμ§λ₯Ό μ΅μ ν μ μμ΅λλ€. νμ§λ§ @SuppressWarnings("unchecked")λ ν μμ μ±μ΄ νμ€ν λλ§ μ¬μ©ν΄μΌ ν©λλ€.
@JsonProperty("address")
μ€μ²©λ JSON κ°μ²΄μΈ addressλ₯Ό Map<String,Object>
νμμΌλ‘ unpackNested νλΌλ―Έν°λ‘ λμ΄μ¨ addressμ 맀νμν€κΈ° μν¨μ
λλ€. λ§μ΄ μ΄μ§ ν·κ°λ¦¬μ€ μ μλλ°, @JsonProperty(μ΄λ¦) μ΄λ
Έν
μ΄μ
μμ κ΄νΈ μμ "μ΄λ¦"μ JSON κ°μ²΄μ keyλ₯Ό μλ―Ένλ€κ³ μκ°νμλ©΄ λ©λλ€.
private void unpackNested(Map<String,Object> address) {
this.city = (String)address.get("city");
JSON κ°μ²΄μΈ address λ Map<String,Object>
νμ
μΌλ‘ νλΌλ―Έν°λ‘ λμ΄μμ£ . κ·Έ Map
μμ keyκ° "city"μΈ valueλ₯Ό κΊΌλ΄ String
μΌλ‘ νλ³νν΄μ£Όλ©΄, νλμ private String city;
μ 맀νλ©λλ€. -> 1λ 벨 κΉμ΄μ 맀ν μλ£
Map<String,String> apart = (Map<String,String>)address.get("apart");
this.apartName = apart.get("apartName");
Map<String,Object>
νμ
μ addressμμ, keyκ° "apart"μΈ Valueλ₯Ό κΊΌλ
λλ€. μ΄λ κΊΌλ΄μ§ 2λ 벨 κΉμ΄μ JSON κ°μ²΄λ₯Ό Map<String, String>
νμ
μΌλ‘ νλ³νν΄μ μλ‘μ΄ Map
apartλ₯Ό μμ±ν©λλ€. λ§μ§λ§μΌλ‘ Map
νμ
μ apartμμ, keyκ° "apartName" μΈ Valueλ₯Ό κΊΌλ΄ νλμ private String apartName
κ³Ό 맀νν©λλ€. -> 2λ 벨 κΉμ΄μ 맀ν μλ£
μ΄λ κ² λ§€νμ΄ μλ£λ©λλ€.
κ·Έλ°λ° μμ±ν΄λκ³ λ³΄λ, μ Riot api
μ μλ΅μ²λΌ μ€μ²©λ depthκ° 1,2 λ 벨 μμ€μ΄ μλ κ²½μ°μλ μ΄λ
Έν
μ΄μ
μ μ¬μ©ν 맀νμ΄ κ·Έλ₯ ν¨μ¨μ μΌλ‘ λκ»΄μ§μ§ μμ΅λλ€. 맀 κΉμ΄λ§λ€ Map
μ μμ±νλ©΄ μ€λ²ν€λλ μ¦κ°ν κ²μ΄κ³ , 무μλ³΄λ€ μ½λ μμΌλ‘ μλ§μ λ°λ³΅μ΄ λ°μν κ² κ°μ΅λλ€.
μ€λ λ€λ£¨μ§ μμ JsonNodeλ₯Ό μ¬μ©ν 맀ν μ½λλ₯Ό μ½μ΄λ³΄λ μ΄κ² λ«κ² λ€ μΆλ€μ.
κ·Έλ¬λ©΄ λ€μμ JsonNodeλ₯Ό μ¬μ©ν 맀ν ν¬μ€νΈλ₯Ό μμ±νκ² μ΅λλ€.
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€! νλ¦° λ΄μ© μ§μ νμν©λλ€!
https://www.baeldung.com/jackson-nested-values
https://www.baeldung.com/jackson-annotations
https://colinch4.github.io/2020-07-30/24/
WoW