@JsonNaming
애노테이션 붙여서 네이밍 정책을 지정하면 자동으로 이에 맞는 필드의 값이 바인딩된다.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
}
}
네이밍 정책을 맞춰주는 건 Jackson하고 조금 다른데, GsonBuilder로 객체 생성시에 setFiledNamingPolicy()
에 네이밍 정책을 지정해준다.
필드명이 다른 경우 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;
}
}