[miniProject-1] 2. Json
2. Json
: 데이터 구조. key : value 쌍으로 이루어져 있으며, 현재 웹 상에서 Data를 주고 받을 때 가장 많이 사용하는 데이터 구조 중 하나. 이에따라 Java에서도 Json의 기본클래스를 제공하며, 구글의 gson클래스를 사용해서 Json데이터를 더 쉽게 다룰 수 있음.
1) Json의 기본 구조
-
Json Object
- { key : value } 가 Json Object의 기본 구조이며, 하나의 Json Object 내에는 여러가지의 key : value 쌍이 존재할 수 있음.
-
Json Array
- Json Array는 Object를 배열로 묶어 놓은 것. { key : [ { key : value }, { key : value }, { key : value } ] }.
예시)
{"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>
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
댓글남기기