Spring Boot Deserialization Json, Deserialization JsonString to JsonObject - Json 4편
어찌보면 가장 중요한 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편
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 를 이용하여 처리할 수 있다.