Gson vs. Jackson - Json 문자열 Deserialize 하기

inhalin·2023년 5월 10일
0

일터지식

목록 보기
14/14

Jackson

  • 클래스에 @JsonNaming 애노테이션 붙여서 네이밍 정책을 지정하면 자동으로 이에 맞는 필드의 값이 바인딩된다.
    • 주로 json 문자열에서는 필드명을 snake_case 형태로 쓰고, 자바에서는 camelCase를 사용한다. 이름의 형태가 다른 경우에 이걸 한쪽에 맞추게 되면 다른 쪽에서는 조금 어색하게 느껴질 수 있다. 이때 필드명이 같으면 네이밍 형태가 달라도 자동으로 값을 바인딩해주는 역할을 한다고 보면 된다.
    • 예를 들어,{"my_name":"inhalin"}과 같이 snake case 형태로 json 문자열이 들어오면 자바에서 String myName으로 my_name의 값인 inhalin이 정상적으로 바인딩된다.
  • 필드명이 다를 경우에는 필드에 @JsonProperty 애노테이션을 붙여서 실제 들어오는 필드명을 지정해주어서 값을 가져올 수 있다.
    - 예를 들어, {"my_name":"inhalin"} 형태의 json 문자열의 my_name을 자바에서는 name이라는 필드명으로 받아서 사용하고 싶다면 해당하는 필드에 @JsonProperty("my_name") String name; 과 같이 써주면 된다.

테스트 코드

public class JacksonTest {
    
    @Test
    void jacksonDeserialization() throws IOException {
        // {"product_id":1000, "name":"Product1"}
        String json = "{\"product_id\":1000, \"name\":\"Product1\"}";

        ObjectMapper mapper = new ObjectMapper();
        JacksonProduct product = mapper.readValue(json, JacksonProduct.class);

        assertThat(product.getProductId()).isEqualTo(1000);
        assertThat(product.getProductName()).isEqualTo("Product1");
    }

    @Getter
    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
    static class JacksonProduct {
        private int productId; // product_id: 1000
        
        @JsonProperty("name")
        private String productName; // name: Product1
    }
}

Gson

  • 네이밍 정책을 맞춰주는 건 Jackson하고 조금 다른데, GsonBuilder로 객체 생성시에 setFiledNamingPolicy()에 네이밍 정책을 지정해준다.

    • 인자는 FieldNamingPolicy enum 클래스의 값을 넣어준다. 클래스에 들어가서 보면 가능한 값들이 예시과 함께 잘 정리되어 있다.
  • 필드명이 다른 경우 Jackson의 @JsonProperty과 똑같은데 대신 @SerializedName 애노테이션을 사용한다.

테스트 코드

public class GsonTest {
    
    @Test
    void gsonDeserialization() {
        // {"product_id":1000, "name":"Product1"}
        String json = "{\"product_id\":1000, \"name\":\"Product1\"}";

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .create();
        GsonProduct product = gson.fromJson(json, GsonProduct.class);

        assertThat(product.getProductId()).isEqualTo(1000);
        assertThat(product.getProductName()).isEqualTo("Product1");
    }

    @Getter
    static class GsonProduct {
        private int productId;

        @SerializedName("name")
        private String productName;
    }
}

참고자료

0개의 댓글