ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Gson 라이브러리를 사용한 JSON 데이터 처리
    Java/기타 2019. 5. 19. 16:34
    반응형

    목차

       

      Java에서 JSON 데이터를 처리할 때 가장 널리 사용되는 라이브러리 중 하나가 바로 Gson입니다. Google에서 개발한 Gson은 유연하고 사용이 간편한 JSON 파싱 및 직렬화/역직렬화 라이브러리입니다. 이번 글에서는 Gson 라이브러리를 사용하여 JSON 데이터를 처리하는 다양한 방법을 예제로 설명하겠습니다.

       

      Gson 라이브러리 설정

      우선 Gradle 프로젝트에서 Gson 라이브러리를 사용하기 위해 build.gradle 파일에 다음과 같이 Gson 라이브러리를 추가합니다.

      dependencies {
          implementation 'com.google.code.gson:gson:2.10'
      }

       

      Gson에서 자주 사용하는 메서드

      Gson 라이브러리를 사용할 때 자주 사용하는 주요 메서드는 다음과 같습니다.

      • Gson.fromJsonJSON : 문자열을 지정된 Java 객체로 역직렬화합니다.
      • Gson.toJsonJava : 객체를 JSON 문자열로 직렬화합니다.
      • JsonParser.parseStringJSON : 문자열을 JsonElement로 파싱합니다.
      • JsonElement.getAsJsonObject : JsonElement를 JsonObject로 변환합니다.
      • JsonObject.addProperty : JsonObject에 새로운 속성을 추가하거나 기존 속성 값을 업데이트합니다.
      • JsonObject.add : JsonObject에 JsonElement를 추가합니다.
      • JsonObject.remove : JsonObject에서 지정된 속성을 제거합니다.
      • Gson.toJsonTree : Java 객체를 JsonElement로 변환합니다. 주로 JSON 배열을 처리할 때 유용합니다.

       

      이 메서드들은 Gson을 사용할 때 데이터의 직렬화 및 역직렬화, JSON 데이터 수정 및 탐색 등에 매우 유용합니다. 다음 부분에서는 이러한 메서드를 사용하여 JSON 데이터를 처리하는 다양한 예제를 소개하겠습니다. 


      JSON 파일 예제: store.json

      사용할 store.json 파일의 예시는 다음과 같습니다.

      {
        "store": {
          "book": [
            {
              "category": "reference",
              "author": "Nigel Rees",
              "title": "Sayings of the Century",
              "price": 8.95
            },
            {
              "category": "fiction",
              "author": "Evelyn Waugh",
              "title": "Sword of Honour",
              "price": 12.99
            },
            {
              "category": "fiction",
              "author": "Herman Melville",
              "title": "Moby Dick",
              "isbn": "0-553-21311-3",
              "price": 8.99
            },
            {
              "category": "fiction",
              "author": "J. R. R. Tolkien",
              "title": "The Lord of the Rings",
              "isbn": "0-395-19395-8",
              "price": 22.99
            }
          ],
          "bicycle": {
            "color": "red",
            "price": 19.95
          }
        },
        "expensive": 10
      }

       

      Jackson 라이브러리를 사용한 JSON 처리 방법

      Gson 라이브러리로 JSON 문자열을 객체로 역직렬화

      Gson을 사용하면 Gson의 fromJson 메서드를 통해 JSON 문자열을 쉽게 Java 객체로 변환할 수 있습니다.

      @DisplayName("JSON 문자열을 객체로 역직렬화")
      @Test
      public void testDeserializeJsonStringToObject() {
      
        // Given & When
        StoreWrapper storeWrapper = gson.fromJson(json, StoreWrapper.class);
      
        // Then
        log.debug("storeWrapper: {}", storeWrapper);
        assertAll(
            () -> assertNotNull(storeWrapper),
            () -> assertNotNull(storeWrapper.getStore()),
            () -> assertNotNull(storeWrapper.getStore().getBook()),
            () -> assertNotNull(storeWrapper.getStore().getBicycle())
        );
      }

       

      객체를 JSON 문자열로 직렬화

      Java 객체를 JSON 문자열로 변환(직렬화)하는 방법입니다. 이를 위해 Gson의 toJson 메서드를 사용합니다.

      @DisplayName("객체를 JSON 문자열로 직렬화")
      @Test
      public void testSerializeObjectToJsonString() {
      
        // Given
        StoreWrapper storeWrapper = gson.fromJson(json, StoreWrapper.class);
      
        // When
        String serializedJson = gson.toJson(storeWrapper);
      
        // Then
        log.debug("serializedJson : {}", serializedJson);
        assertAll(
            () -> assertNotNull(serializedJson),
            () -> assertTrue(serializedJson.contains("store"))
        );
      }

       

      JSON 데이터 수정

      특정 JSON 속성의 값을 수정하는 예제입니다. 이를 위해 JsonObject의 addProperty 메서드를 사용합니다.

      @DisplayName("JSON 데이터 수정")
      @Test
      public void testModifyJsonData() {
      
        // Given
        JsonElement rootElement = JsonParser.parseString(json);
        JsonObject modifiedRoot = rootElement.getAsJsonObject();
      
        // When
        // 특정 속성 값 수정
        modifiedRoot.addProperty("expensive", 15);
        JsonElement modifiedElement = modifiedRoot.get("expensive");
      
        // JSON 문자열로 변환
        String modifiedJson = gson.toJson(modifiedRoot);
      
        // Then
        log.debug("modifiedJson : {}", modifiedJson);
        assertAll(
            () -> assertEquals(15, modifiedElement.getAsInt()),
            () -> assertNotNull(modifiedJson),
            () -> assertTrue(modifiedJson.contains("\"expensive\":15"))
        );
      }

       

      JSON 데이터 병합

      두 개의 JSON 객체를 병합하는 방법입니다. JsonObject의 add 메서드를 사용합니다.

      @DisplayName("JSON 데이터 병합")
      @Test
      public void testMergeJsonData() {
      
        // Given
        String additionalJson = "{\"newProperty\":\"newValue\"}";
        JsonElement originalElement = JsonParser.parseString(json);
        JsonElement additionalElement = JsonParser.parseString(additionalJson);
        JsonObject mergedNode = originalElement.getAsJsonObject();
      
        // When
        mergedNode.add("newProperty", additionalElement.getAsJsonObject().get("newProperty"));
      
        // JSON 문자열로 변환
        String mergedJson = gson.toJson(mergedNode);
      
        // Then
        log.debug("mergedJson : {}", mergedJson);
        assertAll(
            () -> assertNotNull(mergedJson),
            () -> assertTrue(mergedJson.contains("\"newProperty\":\"newValue\""))
        );
      }

       

      JSON 속성 추출

      특정 JSON 속성을 추출하여 사용하는 방법입니다. JsonObject의 get 메서드를 사용합니다.

      @DisplayName("JSON 속성 추출")
      @Test
      public void testExtractJsonProperty() {
      
        // Given & When
        JsonElement rootElement = JsonParser.parseString(json);
        JsonElement expensiveElement = rootElement.getAsJsonObject().get("expensive");
      
        // Then
        log.debug("expensive : {}", expensiveElement.getAsInt());
        assertAll(
            () -> assertNotNull(expensiveElement),
            () -> assertEquals(10, expensiveElement.getAsInt())
        );
      }

       

      JSON 속성 추가

      새로운 JSON 속성을 추가하는 방법입니다. JsonObject의 addProperty 메서드를 사용합니다.

      @DisplayName("JSON 속성 추가")
      @Test
      public void testAddJsonProperty() {
      
        // Given
        JsonElement rootElement = JsonParser.parseString(json);
        JsonObject modifiedRoot = rootElement.getAsJsonObject();
      
        // When
        // 속성 추가
        modifiedRoot.addProperty("newProperty", "newValue");
      
        // JSON 문자열로 변환
        String modifiedJson = gson.toJson(modifiedRoot);
      
        // Then
        log.debug("modifiedJson : {}", modifiedJson);
        assertAll(
            () -> assertNotNull(modifiedRoot),
            () -> assertEquals("newValue", modifiedRoot.get("newProperty").getAsString())
        );
      }

       

      JSON 속성 삭제

      특정 JSON 속성을 삭제하는 방법입니다. JsonObject의 remove 메서드를 사용합니다.

      @DisplayName("JSON 속성 삭제")
      @Test
      public void testRemoveJsonProperty() {
      
        // Given
        JsonElement rootElement = JsonParser.parseString(json);
        JsonObject modifiedRoot = rootElement.getAsJsonObject();
      
        // When
        // 속성 삭제
        modifiedRoot.remove("expensive");
      
        // JSON 문자열로 변환
        String modifiedJson = gson.toJson(modifiedRoot);
      
        // Then
        log.debug("modifiedJson : {}", modifiedJson);
        assertAll(
            () -> assertNotNull(modifiedRoot),
            () -> assertFalse(modifiedRoot.has("expensive"))
        );
      }

       

      JSON 배열 처리

      JSON 배열을 처리하는 방법을 알아보겠습니다. Gson의 toJsonTree 메서드를 사용하여 객체를 JsonArray로 변환할 수 있습니다.

      @DisplayName("JSON 배열 처리")
      @Test
      public void testHandleJsonArray() {
      
        // Given
        StoreWrapper storeWrapper = gson.fromJson(json, StoreWrapper.class);
        List<Book> books = storeWrapper.getStore().getBook();
      
        // When
        JsonArray bookArray = gson.toJsonTree(books).getAsJsonArray();
      
        // Then
        assertTrue(bookArray.isJsonArray());
        for (JsonElement bookElement : bookArray) {
          JsonObject bookObject = bookElement.getAsJsonObject();
          log.debug("Book: {}", bookObject);
          assertNotNull(bookObject.get("category"));
          assertNotNull(bookObject.get("author"));
          assertNotNull(bookObject.get("title"));
          assertNotNull(bookObject.get("price"));
          if (bookObject.has("isbn")) {
            assertNotNull(bookObject.get("isbn"));
          }
        }
      }

       

       

      참고 자료

       

      Jackson 라이브러리를 이용한 형변환 -  https://tychejin.tistory.com/311
      json-simple 라이브러리를 사용한 JSON 데이터 처리 - https://tychejin.tistory.com/139
      Jackson 라이브러리를 사용한 JSON 데이터 처리 - https://tychejin.tistory.com/134

       

      소스 코드는 Github Repository 참조하세요. - https://github.com/tychejin1218/blog/tree/main/json-modules/gson

      반응형

      댓글

    Designed by Tistory.