어찌보면 가장 중요한 Deserialization한 JsonString 형태를 파싱하는 방법이다.
Spring Boot에서 Deserialization 파싱을 위해 Jackson과 gson을 사용하면서 동시에 클래스를 생성하여 사용해야한다.
Spring boot Json 1편, 2편, 3편, 마지막
1. 2018/11/06 - [Spring Boot] - Spring Boot Json, JsonObject로 만들기 - JSON 1편
2. 2018/11/07 - [Develop/Spring Boot] - Spring Boot Json, Gson을 이용한 JsonObject to String, String to JsonObject- JSON 2편
3. 2018/11/09 - [Develop/Spring Boot] - Spring Boot Json, Jackson을 이용한 JsonParsing - Json 3편
4. 2018/11/13 - [Develop/Spring Boot] - Spring Boot Json, hashmap to json , JsonObject 만들기- JSON 마지막
번외 Database의 값을 Json으로 select하는 방법.
1. 2018/10/24 - [Spring Boot] - Spring boot jpa map, hashmap, JSON형식
2. 2018/10/28 - [Spring Boot] - Spring boot JPA EntityManager를 이용한 Map형식으로 mapping하기
Spring boot에서 MySQL JSON 타입 SELECT하는 방법
1. 2018/11/30 - [Develop/Spring Boot] - Spring boot MySQL JSON - MySQL JSON DATA TYPE 값 가져오기
1. Class를 생성하여 Gson을 이용한 Deserializaion한 JsonString to Object(JsonObject)
앞의 1편, 2편, 3편에 사용했던 TestDTO를 수정하자.
수정하기 전 먼저 Test_2DTO를 새로 생성한다
public class Test_2DTO {
private String name;
private int age;
public Test_2DTO() {
super();
}
public Test_2DTO(String name, int age) {
super();
this.name = name;
this.age = age;
}
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 class TestDTO {
private Integer id;
private String password;
private List details;
public TestDTO() {
super();
}
public TestDTO(Integer id, String password, List details) {
super();
this.id = id;
this.password = password;
this.details = details;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List getDetails() {
return details;
}
public void setDetails(List details) {
this.details = details;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}
생성했다면,
public void test() {
String jsonString = "{\r\n" +
" \"id\": 1,\r\n" +
" \"password\": \"1234\",\r\n" +
" \"details\": [\r\n" +
" {\r\n" +
" \"name\": \"test\",\r\n" +
" \"age\": 20\r\n" +
" },{\r\n" +
" \"name\": \"test2\",\r\n" +
" \"age\": 21\r\n" +
" }\r\n" +
" ] \r\n" +
"}";
Gson gson = new Gson();
TestDTO t = gson.fromJson(jsonString, TestDTO.class);
System.out.println("id : " +t.getId());
System.out.println("password : "+t.getPassword());
System.out.println("name1 : "+t.getDetails().get(0).getName());
System.out.println("age1: "+t.getDetails().get(0).getAge());
System.out.println("name2 : "+t.getDetails().get(1).getName());
System.out.println("age2: "+t.getDetails().get(1).getAge());
}
위에 사용한 Json내용이다.,
{
"id": 1,
"password": "1234",
"details": [
{
"name": "test",
"age": 20
},{
"name": "test2",
"age": 21
}
]
}
위 test() 메소드를 실행하면 아래와 같이 Deserializaion한 JsonString이 파싱되어 JsonObject에 알맞게 들어간다.

2. Jackson의 ObjectMapper를 이용한 Json String to JsonObject 이다.
Json내용은 위와 동일한 상태에서 진행하였다.
public void test() {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\r\n" +
" \"id\": 1,\r\n" +
" \"password\": \"1234\",\r\n" +
" \"details\": [\r\n" +
" {\r\n" +
" \"name\": \"test\",\r\n" +
" \"age\": 20\r\n" +
" },{\r\n" +
" \"name\": \"test2\",\r\n" +
" \"age\": 21\r\n" +
" }\r\n" +
" ] \r\n" +
"}";
try {
TestDTO t = objectMapper.readValue(jsonString, TestDTO.class); // String to Object로 변환
System.out.println("ObjectMapper테스트");
System.out.println("id : " +t.getId());
System.out.println("password : "+t.getPassword());
System.out.println("name1 : "+t.getDetails().get(0).getName());
System.out.println("age1: "+t.getDetails().get(0).getAge());
System.out.println("name2 : "+t.getDetails().get(1).getName());
System.out.println("age2: "+t.getDetails().get(1).getAge());
} catch (IOException e) {
e.printStackTrace();
}
}

gson과 마찬가지로 잘 작동된다.
3. Jackson JsonNode 를 이용한 Deserializaion String to JsonObject
어떻게 보면 가장 핵심인 부분일 수도 있다. 클래스 생성없이 할 수 있다는 큰 장점이있다.
Deserializaion Json Data는 위와 동일한 데이터를 사용한다.
public void test() {
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = "{\r\n" + " \"id\": 1,\r\n" + " \"password\": \"1234\",\r\n"
+ " \"details\": [\r\n" + " {\r\n" + " \"name\": \"test\",\r\n"
+ " \"age\": 20\r\n" + " },{\r\n" + " \"name\": \"test2\",\r\n"
+ " \"age\": 21\r\n" + " }\r\n" + " ] \r\n" + "}";
try {
System.out.println("Jackson JsonNode 테스트");
JsonNode t = objectMapper.readValue(jsonString, JsonNode.class); // String to Object로 변환
JsonNode id = t.get("id");
System.out.println("id : " + id.asInt());
JsonNode password = t.get("password");
System.out.println("password : " + password.asText());
JsonNode details = t.get("details");
JsonNode details_1 = details.get(0);
System.out.println("name1 : " + details_1.get("name").asText());
System.out.println("age1: " + details_1.get("age").asInt());
JsonNode details_2 = details.get(1);
System.out.println("name2 : " + details_2.get("name").asText());
System.out.println("age2: " + details_2.get("name").asText());
} catch (IOException e) {
e.printStackTrace();
}
}

class 생성없이 파싱이 잘 되었다
이 처럼 웬만한 것들은 class를 생성하여 모든 Deserializaion을 파싱할 수 있으며,
Jackson JsonNode 를 이용하여 처리할 수 있다.