일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- toString
- 출처 : https://webdir.tistory.com/506
- 게시판
- 출처 : https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
- https://velog.io/@velopert/create-typescript-react-component
- http://jeonghwan-kim.github.io/dev/2019/06/25/react-ts.html
- object
- Today
- Total
Back Ground
GSON - java 객체(object)를 JSON 표현식으로 변환하는 API 본문
Gson은 java객체를 JSON 표현식으로 변환할 수 있게 하는 Java 라이브러리이다.
물론, JSON 표현식 형태의 스트링을 java 객체로 변환 또한 가능하다.
주로 사용할 클래스는 Gson이고 그냥 new Gson()으로 객체 생성하면 된다.
GsonBuilder 클래스도 있으나 다양한 셋팅을 해서 Gson객체를 생성할 때나 사용한다.
Gson객체는 상태값 같은 것을 가지고 있지 않으므로
다수의 Json 직렬화(serialization)와 역직렬화(deserialzation) 처리시에 계속 재 사용해도 된다.
밑의 예제는 https://sites.google.com/site/gson/gson-user-guide 사이트의 예제이므로 참고하길 바란다.
그 중 많이 쓸거 같은 예제들만 한번 골라서 알아보자.
1. 자바의 기본자료형 예시(Primitives Examples) 어렵지 않게 변환할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //(Serialization) Gson gson = new Gson(); gson.toJson(1); // ==> prints 1 gson.toJson("abcd"); // ==> prints "abcd" gson.toJson(new Long(10));// ==> prints 10 int[] values = { 1 }; gson.toJson(values); // ==> prints [1] //(Deserialization) int one = gson.fromJson("1", int.class); Integer one = gson.fromJson("1", Integer.class); Long one = gson.fromJson("1", Long.class); Boolean false = gson.fromJson("false", Boolean.class); String str = gson.fromJson("\"abc\"", String.class); String anotherStr = gson.fromJson("[\"abc\"]", String.class); | cs |
2. 자바의 객체 변환 예시. 아래와 같은 클래스가 있다고 가정하자.
1 2 3 4 5 6 7 8 | class BagOfPrimitives { private int value1 = 1; private String value2 = "abc"; private transient int value3 = 3; BagOfPrimitives() { // no-args constructor } } | cs |
JSON 표현식으로 변환을 해보면,
1 2 3 4 5 | // (Serialization) BagOfPrimitives obj = new BagOfPrimitives(); Gson gson = new Gson(); String json = gson.toJson(obj); // ==> json is {"value1":1,"value2":"abc"} | cs |
- private 접근자의 필드들도 변환이 가능하다.
- 특정 어노테이션 사용할 필요없이 기본적으로 현재 클래스의 모든 필드들은 직렬화 및 역직렬화 대상이 된다.
- transient 구분자를 사용하면 직렬화 및 역질렬화 처리에서 제외된다.
- 직렬화시 null 값인 필드는 자동 제외된다. 역질렬화시에 JSON에 일치하는 필드가 없으면 null로 셋팅된다.
- Synthetic 필드는 직렬화 역직렬화 대상에서 제외된다.
- 내부클래스관한 이야기가 있는데.. 너무 복잡하다. 잘 사용 안하므로 skip (궁금하면 원문 참고)
3.배열 예시. 배열은 []로 표현되어 나오며, 어렵지 않게 상호간에 변환된다.
1 2 3 4 5 6 7 8 9 10 11 | Gson gson = new Gson(); int[] ints = {1, 2, 3, 4, 5}; String[] strings = {"abc", "def", "ghi"}; // (Serialization) gson.toJson(ints); // ==> prints [1,2,3,4,5] gson.toJson(strings); // ==> prints ["abc", "def", "ghi"] // (Deserialization) int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); // ==> ints2 will be same as ints | cs |
4. 컬렉션(Collections) 예시. 배열과 같이 []로 표현되며, 하지만 역직렬화할때 좀 다른 걸 알 수 있다.
1 2 3 4 5 6 7 8 9 | Gson gson = new Gson(); Collection<Integer> ints = Lists.immutableList(1,2,3,4,5); // (Serialization) String json = gson.toJson(ints); // ==> json is [1,2,3,4,5] // (Deserialization) Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); Collection<Integer> ints2 = gson.fromJson(json, collectionType); | cs |
자, 객체는 {}로 묶이고, 필드명:value 형식으로 매핑되어 표현되고, 배열은 [ ] 로 묶여 있단 것만 잘 알면된다.
이제 공부한 걸 가지고 이것저것 섞어서 한번 써보자.
2개의 클래스를 만들 것이다.
Memeber 클래스 | School 클래스 |
회원정보를 가지고 있으며, 회원이름과 나이, 그리고 다니던 학교들의 정보를 list로 가지고있다. | 회원이 다녔던 학교정보를 가지고 있다. 학교이름, 학교위치, 입학년도 간단히 3가지정보 |
Member.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.util.List; public class Member { private String name; private int age; private List<School> schools; public Member(String name, int age, List<School> schools){ this.name = name; this.age = age; this.schools = schools; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<School> getSchools() { return schools; } public void setSchools(List<School> schools) { this.schools = schools; } } | cs |
School.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public class School { private String name; private String location; private int enterYear; public School(String name, String location, int enterYear){ this.name = name; this.location = location; this.enterYear = enterYear; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public int getEnterYear() { return enterYear; } public void setEnterYear(int enterYear) { this.enterYear = enterYear; } } | cs |
자 이런 2개의 클래스가 있다고 하자.
Gson객체를 이용하여 JSON 표현식으로 변환했다가 다시 자바객체로 되돌리는 작업을 수행해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.util.ArrayList; import java.util.List; import com.google.gson.Gson; public class ZExecute { public static void main(String[] args){ Gson gson = new Gson(); List<School> schools = new ArrayList<School>(); schools.add(new School("A학교", "서울", 2000)); schools.add(new School("B학교", "대구", 2003)); schools.add(new School("C학교", "광주", 2006)); String result = gson.toJson(new Member("lee", 20, schools)); System.out.println("=========== JSON 표현식으로 변환 ==========="); System.out.println(result); Member mee = gson.fromJson(result, Member.class); System.out.println(""); System.out.println("=========== 자바 객체로 복원 ==========="); System.out.println(mee.getName()); System.out.println(mee.getAge()); for (School school : mee.getSchools()){ System.out.println(school.getEnterYear()+", " +school.getName()+", " +school.getLocation()); } } } | cs |
실행하면 아래의 결과로 출력된다.
잘 변환되고 복원되었음을 알 수 있다.
결과
=========== JSON 표현식으로 변환 =========== {"name":"lee","age":20,"schools":[{"name":"A학교","location":"서울","enterYear":2000},{"name":"B학교","location":"대구","enterYear":2003},{"name":"C학교","location":"광주","enterYear":2006}]} =========== 자바 객체로 복원 =========== lee 20 2000, A학교, 서울 2003, B학교, 대구 2006, C학교, 광주 |
'JAVA' 카테고리의 다른 글
ModelAndView (0) | 2017.06.01 |
---|---|
JVM 메모리 구조 (1) | 2017.03.09 |
JAVA - 배열[] (0) | 2017.02.15 |
오버라이딩/오버로딩 (1) | 2016.07.10 |
toString이란? (1) | 2016.07.10 |