Json?
json 이 뭘까요? json이라고 검색해보면 www.json.org 에 " 경량의 DATA-교환 형식이다." 이렇게 나와있다. 무슨 소린지 이해가 안다. 프로그래밍을 많이 해보신분이라면 사실 저걸 왜 이해 못해라고 생각할 수 있지만 우리가 프로그래밍을 처음 배울때 DATA의 교환에 대해서 이해하는데 엄청난 시간이 걸렸던것을 생각해보면 초보자는 쉽게 이해할만한 문장은 아니다. 쉬운 비유를 통해 알아보도록 하겠다.
Json 은 쉽게 이해하자면 흔히 말하는 확장자 개념으로 이해하면 쉽다. 사진을 친구와 주고받는데 png파일인지 jpeg 파일인지 같은 사진이라도 확장자가 다를 수 있다. 우리가 프로그래밍 상에서 주고받는 데이터중에서 여러가지 데이터의 유형이 있지만 Json은 그 유형중 하나라고 보면된다.
그럼 데이터를 주고받는다는게 무엇인가요? 아래 그림 처럼 친구와 "잘지내?","어" 라는 대화를 주고 받았다고 생각해보자
우리는 "잘지내?","어" 라는 문자 데이터를 주고 받은것이다. 이속에서 문자를 주고받을때 단말기와 서버, 서버와 단말기끼리 데이터를 주고 받는 과정에서 데이터는 json 형태로 주고 받을 수 있다. 이제 데이터를 주고 받을때 json으로 한다는말이 어떤것인지 알게 되었을 것이다.
그럼저 Json은 어떻게 쓰나요?
Json은 기본적으로 Key - Value 의 형태를 띄고 있다.
{
"name": "Edge_JH",
"message": "잘 지내?",
"to": "MyFriend"
}
위의 형식이 Json 형태의 데이터이다. name = Edge_JH, message="잘 지내?"... 이런식으로 Key-Value형식으로 데이터가 정의 된다. 여기서 Value는 String,Number(숫자 자바의 int,double,long,float 다 포함),Boolean,Array,Object 를 가질 수 있다.
자바로 보자면 Map 구조와 상당히 유사하다.
안드로이드에서 Json 을 사용하는 방법은 대표적으로 두가지가 있다.위의 예시 Json을 가지고 JSON.org 를 이용하는 방법과 구글에서 제공하는 Gson에 대해서 알아보도록 하겠다.
Json 만들기
JSON.org
public static String toPrettyFromatJSON() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("Id", 1);
jsonObject.put("name", "Edge_JH");
jsonObject.put("message", "잘 지내??");
jsonObject.put("to", "My Friend");
return jsonObject.toString();
}
Gson
public static String toPrettyFormatGson() {
JsonObject object = new JsonObject();
object.addProperty("id", 1);
object.addProperty("name", "Edge_JH");
object.addProperty("message", " 잘 지내?");
object.addProperty("to", "My Friend");
Gson gson = new Gson();
return gson.toJson(object);
}
두라이브러리 둘다 Json을 만드는 방식은 비슷하다. JSON.org 는 JSONObject에 put 이라는 메소드를 통해 key-Value를 작성하고 Gson은 addProperty를 통해 key-Value를 작성한다.
String to Json
JSON.org
public static String stringToJsonJSON(String json){
JSONObject jsonObject = new JSONObject(json);
return jsonObject.getString("message");
}
Gson
public static String stringToJsonGSON(String json){
Gson gson =new Gson();
JsonObject jsonObject = gson.fromJson(json,JsonObject.class);
return jsonObject.get("message").getAsString();
}
위 두가지 메소드를 살펴 보면 JSONObject를 초기화 할때 인자로 스트링으로 된 형태의 Json 을 넘겨주게 되면 Json으로 사용이 가능하고 getString() 메소드를 통해 Json파일의 Key값을 통해서 Value를 가져올 수 있다. Gson도 마찬가지 이지만 초기화할때 gson.fromJson(스트링,JsonObject.class) 를 통해 Json으로 사용 가능하다.
기본적으로 String to Json 부분만 잘안다면 서버로 부터 데이터를 Json으로 받아와서 사용 하는것이 무리는 없을 것이다.
추가적으로 Gson에 대해서 좀더 알아보자면 Gson의 가장 강력한 기능은 mapping 기능이다.mapping 이란 Json의 Key-Value 형태를 자바의 변수-값 형태로 매핑이 가능하다.
class KaKaoMessage {
int id;
String name;
String message;
String to;
public KaKaoMessage(int id, String name, String message, String to) {
this.id = id;
this.name = name;
this.message = message;
this.to = to;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getMessage() {
return message;
}
public String getTo() {
return to;
}
}
위의 클래스를 보면 우리가 만들었던 id,name,message,to 가 변수화 되어서 선언되어 있는것을 볼 수 있다. 각각의 같은 이름의 변수에 값을 아래와 같은 방법으로 넣어줄 수 있다.
public static String gsonMapping(String json){
Gson gson = new Gson();
KaKaoMessage model = gson.fromJson(json,KaKaoMessage.class);
return model.getMessage();
}
아래 메소드를 실행해보면 "잘 지내?"라는 string을 받아볼 수 있을 것이다.
Gson의 모델클래스는 저렇게 변수를 Json의 키값과 일치하게 작성하여 사용도 가능하지만
class KaKaoMessage {
@SerializedName("id")
int aa;
@SerializedName("name")
String bb;
@SerializedName("message")
String cc;
@SerializedName("to")
String dd;
public KaKaoMessage(int id, String name, String message, String to) {
this.aa = id;
this.bb = name;
this.cc = message;
this.dd = to;
}
public int getId() {
return aa;
}
public String getName() {
return bb;
}
public String getMessage() {
return cc;
}
public String getTo() {
return dd;
}
}
위와 같이 @SerializedName("키값") 을 통해 변수가 달라도 매핑을 가능하게 하는 자바의 어노테이션 기능을 제공하고 있다.
Gson은 이 클래스 매핑이라는 기능을 통해 서버로 부터 받을 데이터에 대해서 정확하게 클래스로 명시가 가능하고 유지보수가 상당히 쉬워지는 장점을 제공한다.
이상 Json 사용법 포스팅 끝!!!
ps.
비전공자 안드로이드 질문방을 운영중입니다.
톡방링크 (링크) 를 통해 들어오시면 못다 설명드린내용들 자세히 설명드릴게요!!!
이깟 블로그보다 직접만나서 배워보고 싶으시면 말리지 않습니다. 어서오세요 (링크)
마지막으로....제가 만든 앱 (링크) 입니다. 리뷰... 하나가 생명을 살립니다. 감사합니다.
'Android 하나하나 집어보기' 카테고리의 다른 글
자바 Builder 클래스를 이용하자 (3) | 2017.11.24 |
---|---|
RealmDB와 AES 암호화를 이용하여 데이터 저장하기 (1) | 2017.11.21 |
안드로이드 MVP 패턴에 대해 알아보자! (5) | 2017.10.31 |
Retrofit으로 날씨 api를 이용한 통신 예제!! (11) | 2017.10.26 |
Android(안드로이드 스튜디오) WIFI로 디버깅하기 USB 바이바이 (0) | 2017.10.24 |