2 분 소요

2. Json

: 데이터 구조. key : value 쌍으로 이루어져 있으며, 현재 웹 상에서 Data를 주고 받을 때 가장 많이 사용하는 데이터 구조 중 하나. 이에따라 Java에서도 Json의 기본클래스를 제공하며, 구글의 gson클래스를 사용해서 Json데이터를 더 쉽게 다룰 수 있음.

1) Json의 기본 구조

  • Json Object

  • { key : value } 가 Json Object의 기본 구조이며, 하나의 Json Object 내에는 여러가지의 key : value 쌍이 존재할 수 있음.

json-object

  • Json Array

  • Json Array는 Object를 배열로 묶어 놓은 것. { key : [ { key : value }, { key : value }, { key : value } ] }.

json-array

예시)
{"employees":[
  { "firstName":"John", "lastName":"Doe" },
  { "firstName":"Anna", "lastName":"Smith" },
  { "firstName":"Peter", "lastName":"Jones" }
]}

** xml과의 비교*

: tag가 있기 때문에 자료를 다루는 것은 더 쉬울 수 있으나, 자료를 감싸고 있는 tag의 데이터때문에 데이터 크기가 매우 커짐.

<employees>
  <employee>
    <firstName>John</firstName> <lastName>Doe</lastName>
  </employee>
  <employee>
    <firstName>Anna</firstName> <lastName>Smith</lastName>
  </employee>
  <employee>
    <firstName>Peter</firstName> <lastName>Jones</lastName>
  </employee>
</employees>

*w3cschools.com참조

2) Json 클래스(Gson 사용)

: Json을 다루는 구글 오픈소스. Json <-> Java Object 변환을 가능하게 해줌.

  • 라이브러리 직접 추가: jar파일을 다운받아서 사용할 프로젝트 라이브러리에 추가.

  • dependency 활용: 프로젝트 파일의 pom.xml에 추가

    [ Maven ]
      
    <dependency>  
        <groupId>com.google.code.gson</groupId>  
        <artifactId>gson</artifactId>  
        <version>2.9.0</version>
    </dependency>
      
          
    [ Gradle ]
          
    dependencies {  
        implementation 'com.google.code.gson:gson:2.9.0'
    }
    

1. Gson 객체 생성 후 Json <–> Object

import com.google.gson.Gson;
import com.google.gson.GsonBuilder; 

public class test {    
    static class Human {
        String name;
        String gender;
        public Human(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
    }
    
    public static void main(String[] args) {                
   		// Gson 객체 생성
        Gson gson = new Gson();         
        
        // Json 객체 생성
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", "Kim");
        jsonObject.addProperty("gender", "male");
            
        // Object(Java Class) -> String
        Human me = new Human("Kim", "male");
        String meJson = gson.toJson(me);
        System.out.println(meJson); // {"name" : "Kim", "gender" : "male"}
        
        // Json Object -> String
        String jsonStr = gson.toJson(jsonObject);
        System.out.println(jsonStr); // {"name" : "Kim", "gender" : "male"}
        
        // String -> Object(Java Class)
        Human me2 = gson.fromJson(jsonStr, Human.class);
            
        // Object(Java Class) -> String List
        List<Human> list = new ArrayList<>();
        list.add(new Human("Lee", "female"));
        list.add(new Human("Park", "male"));
        String listJson = gson.toJson(list);
        
        // String List -> Object(Java Class)
        List<Human> list = g.fromJson(listJson, new TypeToken<List<Human>>(){}.getType());
            
    }
}

2. API로 받은 JsonObject 핸들링

예시코드)
try {
    Gson gson = new Gson();

    URL url = new URL("http://openapi.seoul.go.kr:8088/" + key + "/json/TbPublicWifiInfo/1/5/");
    
    BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
    String result = br.readLine();

    JsonParser jsonParser = new JsonParser();
    JsonObject jsonObject = (JsonObject)jsonParser.parse(result); // Json객체에 전달받은 자료 담기
    JsonObject jsonWifiInfo = (JsonObject)jsonObject.get("TbPublicWifiInfo");

    Integer totalDataCnt = Integer.valueOf(jsonWifiInfo.get("list_total_count").toString()); // 총 데이터 개수
    
    int start = 1; // 1 ~ 100개 데이터를 받아온다고 가정했을 경우
    int end = 100;
    URL url2 = new URL("http://openapi.seoul.go.kr:8088/" + key + "/json/TbPublicWifiInfo/" + start + "/" + end + "/");
				
    BufferedReader br2 = new BufferedReader(new InputStreamReader(url2.openStream(), "UTF-8"));
    result = br2.readLine();

    JsonParser jsonParser2 = new JsonParser();
    JsonObject jsonObject2 = (JsonObject)jsonParser2.parse(result);
    JsonObject jsonWifiInfo2 = (JsonObject)jsonObject2.get("TbPublicWifiInfo");

    // Json데이터를 Array로 받기 
    JsonArray data = (JsonArray)jsonWifiInfo2.get("row");

    // 배열을 리스트형태로 다루기
    List<Data> list = new ArrayList<>();
    String slistJson = gson.toJson(data);
    list = gson.fromJson(slistJson, new TypeToken<List<Data>>(){}.getType());
    // list에 있는 데이터 1개가 Data 객체 1개씩이 됨
    
} catch (Exception e) {
    e.printStackTrace();
}
Json 데이터 예시)
  "TbPublicWifiInfo": {
    "list_total_count": 17795,
    "RESULT": {
      "CODE": "INFO-000",
      "MESSAGE": "정상 처리되었습니다"
    },
    "row": [
      {
        "X_SWIFI_MGR_NO": "ARI00001",
        "X_SWIFI_WRDOFC": "서대문구",
        "X_SWIFI_MAIN_NM": "상수도사업본부",
        "X_SWIFI_ADRES1": "서소문로 51",
        "X_SWIFI_ADRES2": "본관 1F",
        "X_SWIFI_INSTL_FLOOR": "",
        "X_SWIFI_INSTL_TY": "7-1. 커뮤니티 - 행정",
        "X_SWIFI_INSTL_MBY": "서울시(AP)",
        "X_SWIFI_SVC_SE": "공공WiFi",
        "X_SWIFI_CMCWR": "수도사업소자가망",
        "X_SWIFI_CNSTC_YEAR": "2014",
        "X_SWIFI_INOUT_DOOR": "실내",
        "X_SWIFI_REMARS3": "",
        "LAT": "126.96675",
        "LNT": "37.561924",
        "WORK_DTTM": "2022-07-23 10:57:57.0"
      },
      {
        "X_SWIFI_MGR_NO": "ARI00002",
        "X_SWIFI_WRDOFC": "서대문구",
        "X_SWIFI_MAIN_NM": "상수도사업본부",
        "X_SWIFI_ADRES1": "서소문로 51",
          ...
          ...
          ...

마지막 수정일시: 2022-07-25 23:29

댓글남기기