JSON
을 사용하기전에 당연히 여러곳에서 무엇인지를 검색한 뒤에 사용했지만 역시 설명하려고 하면 버벅거리게 되는것 같습니다. 아무래도 정확히 알지 못해서인것 같습니다. 때문에 생각 정리도 할 겸 JSON
과 GSON
에 대한 포스팅을 하려고 합니다.
1.1 JSON 이란?
JavaScript에서 객체를 표현하는 방법이지만, 다양한 프로그래밍언어에서 데이터를 주고 받기위해 사용됩니다. XML등 과 같이 데이터를 표현하는 일종의 데이터 표현 표준입니다. 주로 인터넷상에서 데이터를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있습니다. 항상 어딘가에 정의처럼 적혀져 있는 설명은 이해하기 어려운것 같습니다. 한번 보고 설명하는 편이 이해가 쉬울 것이라 생각됩니다.
x
{
"name" : "jjy",
"age" : 26
}
위에 보이는 데이터 형식이 바로 json
입니다. 어떤 의미일까요? 네 바로 name(이름)은 jjy이며 age(나이)는 26인 데이터 입니다.
이처럼 json은 {}(중괄호)
를 통해 하나의 객체를 표현하며, 내부에는 key:value
쌍으로 각 속성값을 정의하고 있으며 key와 value
는:(콜론)
에 의해 구분되고 각각의 속성은 ,(쉼표)
로 구분되어집니다.
1.2 JSON 문법
- 객체는 {}(중괄호)
로 표기합니다.
- 배열은 [](대괄호)
로 표기합니다.
- 각 속성은 key
와 value
쌍으로 이루어져 있으며 :(콜론)
으로 구분됩니다.
- 속성이 여러개인 경우 ,(쉼표)
로 구분합니다.
1.3 왜 많이 사용할까?(장점)
가독성
앞서 살펴본 예제 처럼 객체의 구조를 파악하기 쉬운 형태로 이루어져 있다는 것을 알 수 있습니다.
가볍다
우선 json
보다 일찍 탄생한 xml
의 경우 무겁다는 단점이 있습니다. 왜 무거울까요? 그것은 데이터 마다 태그를 이용해 설명을 부여했기 때문입니다. 그에 반해 json
은 태그를 사용하지 않고 name:value
쌍으로 데이터를 표현하여 xml에 비해 가볍다는 장점이 있습니다.
플랫폼 독립적
특정 언어나 플랫폼에 독립적이어서 위의 JSON 형식만을 지킨다면 어떤 시스템간이든 데이터 교환이 가능해 집니다. 또한 대부분의 언어에서 JSON 라이브러리를 제공하기 때문에 편리하게 사용할 수 있습니다.
1.4 Json 라이브러리 사용
json 라이브러리를 사용하기 위해서는 우선 라이브러리를 추가해주어야 합니다. (gradle, maven
과 같은 build tool
을 사용하여 의존성을 추가하는 방법이 편리하겠죠?)
String을 이용한 jsonObject 생성
xxxxxxxxxx
package pack;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonTest {
public static void main(String[] args) {
String jsonString = "{'age':20, 'name':'jjy'}";
try {
JSONObject json = new JSONObject(jsonString);
System.out.println(json);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
==== 결과 ====
{"age":20,"name":"jjy"}
우선 json으로 변경하기 위한 String을 간단하게 생성했습니다. 문자열의 경우 ''
(작은따옴표) 를 이용하여 작성하면됩니다. 그 후 JSONObject
객체를 생성하여 위의 jsonString을 매개변수로 넘겨줍니다. 이렇게 하면 매개변수로 전달된 jsonString이 JSONObject로 생성이 됩니다. 이때 임의로 생성한 jsonString이 json 문법에 맞지 않아 예외를 내뱉을 수 있으므로 try,catch문으로 감싸주어야 합니다.
간단하게 여러 경우를 테스트해본 결과 숫자만
있다면 자동으로 정수형으로 인식하고, 숫자+문자열
또는 문자열
로만 이루어진 경우에는 자동으로 문자열로 인식하여 JSONObject로 변환됩니다.
xxxxxxxxxx
String jsonString = "{'age':20, 'name':'jjy'}";
try {
JSONObject json = new JSONObject(jsonString);
System.out.println(json.getInt("age"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
==== 결과 ====
20
또한 위 코드와 같이 JSON 객체의 get*("Key")
메소드를 이용해 Key
에 해당하는 value
만을 가져올 수도 있습니다.
xxxxxxxxxx
package pack;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class JsonTest {
public static void main(String[] args) {
String jsonString = "{age:20, name:'jjy', 'student2':{'age':21, 'name'='galid'}}";
try {
JSONObject json = new JSONObject(jsonString);
System.out.println(json.getJSONObject("student2"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
==== 결과 ====
{"name":"galid","age":21}
위의 경우에는 하나의 JSON 객체 안에 student2
를 key값으로 가지는 또 하나의 객체가 존재하는 것을 볼 수 있습니다. 이 때 getJSONObject("key")
메소드를 이용하여 student2
를 key로 하는 jsonObject를 가져올 수도 있습니다.
put Method를 이용한 JsonObject 생성
package com.java.ex;
import org.json.JSONObject;
public class Main {
public static void main(String[] args) {
JSONObject object = new JSONObject();
object.put("age", 20);
object.put("name", "jjy");
System.out.println(object);
}
}
메소드를 이용한다면 json 규격에 맞추어 데이터가 추가 되므로 예외처리를 해주지 않아도 됩니다. 하지만 String으로 직접 작성하는 것보다 속도가 떨어질 수는 있습니다. 취향에 맞게 사용하면 될 것 같습니다.
2. GSON 이란
gson은 json구조를 띄는 직렬화된 데이터를 JAVA의 객체로 역직렬화, 직렬화 해주는 자바 라이브러리 입니다. 즉, JSON Object -> JAVA Object
또는 그 반대의 행위를 돕는 라이브러리 입니다.
2.1 GSON 사용법
역시 gson을 사용하기 위해서는 라이브러리를 추가해주어야 합니다.
JSON 데이터를 JAVA Object로 변경하기
xxxxxxxxxx
package pack;
public class Student {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public void getInfo() {
System.out.println("이름은 : " + this.name +"이고, 나이는 " + this.age + "입니다.");
}
}
우선 변경의 대상인 Student Class를 생성해줍니다. gson을 이용하여 json을 java 객체로 성공적으로 변경 되었다면 getInfo() 메소드를 호출할 수 있을것입니다.
xxxxxxxxxx
package com.java.ex;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.java.ex.Student;
public class Main {
public static void main(String[] args) {
String jsonString = "{'age':20, 'name':'jjy'}";
Gson gson = new GsonBuilder().create();
Student student = gson.fromJson(jsonString, Student.class);
student.getInfo();
}
}
==== 결과 ====
이름은 : jjy이고, 나이는 20입니다.
사용법은 간단합니다. 우선 String 형으로 jsonObject를 생성합니다. 그후 GSON객체의 fromJson(jsonString, javaObject.class)
를 이용하여 변환하면 됩니다. fromJson()
메소드의 첫번째 인자로는 json구조를 띈 String을 넘겨주면되고, 두번째 인자로는 변환을 원하는 Java의 Class를 넘겨주면 됩니다. 당연히 반환형은 2번째 인자로 넘겨준 Class 입니다.
Java Object를 Json으로 변환하기
xxxxxxxxxx
package com.java.ex;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.java.ex.Student;
public class Main {
public static void main(String[] args) {
Student student = new Student(20, "jjy");
Gson gson = new GsonBuilder().create();
String json = gson.toJson(student);
System.out.println(json);
}
}
==== 결과 ====
{"age":20,"name":"jjy"}
java객체를 json형식으로 변환하는 것은 더욱 쉽습니다. gson객체의 toJson("Java 객체")
메소드를 이용하면 됩니다. 매개변수로는 json으로 변환하고 싶은 data를 넣어주면 됩니다.
변환하려는 JAVA Object내부에 다른 객체가 존재하는 경우
xxxxxxxxxx
package com.java.ex;
public class Pencil {
private String brand;
public Pencil() {
this.brand = "monami";
}
}
Student 클래스
가 포함할 Pencil
클래스입니다.
xxxxxxxxxx
package com.java.ex;
public class Student {
private int age;
private String name;
private Pencil pencil;
public Student(int age, String name) {
this.age = age;
this.name = name;
this.pencil = new Pencil();
}
public void getInfo() {
System.out.println("이름은 : " + this.name +"이고, 나이는 " + this.age + "입니다.");
}
다음과 같이 Student의 생성자가 호출될 때 Pencil객체를 생성하도록 했습니다.
xxxxxxxxxx
package com.java.ex;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.java.ex.Student;
public class Main {
public static void main(String[] args) {
Student student = new Student(20, "jjy");
Gson gson = new GsonBuilder().create();
String json = gson.toJson(student);
System.out.println(json);
}
}
==== 결과 ====
{"age":20,"name":"jjy","pencil":{"brand":"monami"}}
gson에서는 이전과 같이 그냥 toJson메소드의 매개변수로 Student 객체를 넣어주기만 했습니다. 그런데 내부의 Pencil 객체도 함께 json형식으로 바뀐것을 볼 수 있습니다.
'Language > Java' 카테고리의 다른 글
Java - Annotation 이란? Annotation 사용법 (0) | 2019.05.02 |
---|---|
Java - Lambda Expression(람다식)이란? (2) | 2019.04.09 |
Java - Eclipse에서 Gradle프로젝트 생성한 뒤 Build 하기 (0) | 2019.03.30 |
Java - 직렬화에 관해서(csv, json, java serializable) (0) | 2019.03.30 |
Java - JRE vs JDK (0) | 2019.01.08 |