Jackson JSON보기

Jackson상의

방금 Spring 5 및 Spring Boot 2의 기본 사항에 초점을 맞춘 새로운 Learn Spring 과정을 발표했습니다 .

>> 과정 확인

1. 개요

이 튜토리얼에서는 Jackson JSON 뷰를 사용하여 객체를 직렬화 / 역 직렬화하고 뷰를 사용자 정의하고 마지막으로 Spring과 통합을 시작하는 방법을 살펴 봅니다.

2. JSON보기를 사용하여 직렬화

먼저-간단한 예제 살펴 보겠습니다 . @JsonView를 사용 하여 객체를 직렬화합니다 .

다음은 우리의 견해입니다.

public class Views { public static class Public { } }

그리고 " 사용자 "엔티티 :

public class User { public int id; @JsonView(Views.Public.class) public String name; }

이제 뷰를 사용하여 " User "인스턴스를 직렬화 해 보겠습니다 .

@Test public void whenUseJsonViewToSerialize_thenCorrect() throws JsonProcessingException { User user = new User(1, "John"); ObjectMapper mapper = new ObjectMapper(); mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); String result = mapper .writerWithView(Views.Public.class) .writeValueAsString(user); assertThat(result, containsString("John")); assertThat(result, not(containsString("1"))); }

특정 뷰가 활성화 된 상태에서 직렬화하기 때문에 올바른 필드 만 직렬화되는 것을 볼 있습니다.

또한 기본적으로 뷰의 일부로 명시 적으로 표시되지 않은 모든 속성이 직렬화된다는 점을 이해하는 것도 중요합니다. 편리한 DEFAULT_VIEW_INCLUSION 기능 으로이 동작을 비활성화 합니다.

3. 여러 JSON보기 사용

다음 – 여러 JSON 뷰를 사용하는 방법을 살펴 보겠습니다. 각 뷰에는 다음 예제와 같이 서로 다른 필드가 있습니다.

여기에서 Internal이 Public을 확장 하고 내부 뷰가 public을 확장하는 뷰가 있습니다.

public class Views { public static class Public { } public static class Internal extends Public { } }

다음은 필드 ID이름공개 보기에 포함 된 엔티티 " Item "입니다 .

public class Item { @JsonView(Views.Public.class) public int id; @JsonView(Views.Public.class) public String itemName; @JsonView(Views.Internal.class) public String ownerName; }

공용 뷰를 사용하여 직렬화하면 ID이름 만 JSON으로 직렬화됩니다.

@Test public void whenUsePublicView_thenOnlyPublicSerialized() throws JsonProcessingException { Item item = new Item(2, "book", "John"); ObjectMapper mapper = new ObjectMapper(); String result = mapper .writerWithView(Views.Public.class) .writeValueAsString(item); assertThat(result, containsString("book")); assertThat(result, containsString("2")); assertThat(result, not(containsString("John"))); }

그러나 내부 보기를 사용하여 직렬화를 수행하면 모든 필드가 JSON 출력의 일부가됩니다.

@Test public void whenUseInternalView_thenAllSerialized() throws JsonProcessingException { Item item = new Item(2, "book", "John"); ObjectMapper mapper = new ObjectMapper(); String result = mapper .writerWithView(Views.Internal.class) .writeValueAsString(item); assertThat(result, containsString("book")); assertThat(result, containsString("2")); assertThat(result, containsString("John")); }

4. JSON보기를 사용하여 역 직렬화

이제 JSON 뷰를 사용하여 객체, 특히 User 인스턴스 를 역 직렬화하는 방법을 살펴 보겠습니다 .

@Test public void whenUseJsonViewToDeserialize_thenCorrect() throws IOException { String json = "{"id":1,"name":"John"}"; ObjectMapper mapper = new ObjectMapper(); User user = mapper .readerWithView(Views.Public.class) .forType(User.class) .readValue(json); assertEquals(1, user.getId()); assertEquals("John", user.getName()); }

주어진 뷰를 사용하여 ObjectReader 를 생성하기 위해 readerWithView () API를 어떻게 사용하는지 주목하십시오 .

5. JSON보기 사용자 지정

다음 – JSON보기를 사용자 지정하는 방법을 살펴 보겠습니다. 다음 예 에서는 직렬화 결과에서 User " name "UpperCase 를 작성하려고합니다 .

BeanPropertyWriterBeanSerializerModifier 를 사용 하여 JSON 뷰를 사용자 정의합니다. 첫째 – 사용자 이름대문자 로 변환 하는 BeanPropertyWriter UpperCasingWriter입니다 .

public class UpperCasingWriter extends BeanPropertyWriter { BeanPropertyWriter _writer; public UpperCasingWriter(BeanPropertyWriter w) { super(w); _writer = w; } @Override public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception { String value = ((User) bean).name; value = (value == null) ? "" : value.toUpperCase(); gen.writeStringField("name", value); } }

그리고 여기 에 사용자 정의 UpperCasingWriter로 사용자 이름 BeanPropertyWriter 를 설정 하는 BeanSerializerModifier 가 있습니다 .

public class MyBeanSerializerModifier extends BeanSerializerModifier{ @Override public List changeProperties( SerializationConfig config, BeanDescription beanDesc, List beanProperties) { for (int i = 0; i < beanProperties.size(); i++) { BeanPropertyWriter writer = beanProperties.get(i); if (writer.getName() == "name") { beanProperties.set(i, new UpperCasingWriter(writer)); } } return beanProperties; } }

이제 수정 된 Serializer를 사용하여 User 인스턴스를 직렬화하겠습니다 .

@Test public void whenUseCustomJsonViewToSerialize_thenCorrect() throws JsonProcessingException { User user = new User(1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier(new MyBeanSerializerModifier()); ObjectMapper mapper = new ObjectMapper(); mapper.setSerializerFactory(serializerFactory); String result = mapper .writerWithView(Views.Public.class) .writeValueAsString(user); assertThat(result, containsString("JOHN")); assertThat(result, containsString("1")); }

6. Spring에서 JSON보기 사용

마지막으로 Spring Framework 와 함께 JSON 뷰를 사용하는 방법을 간단히 살펴 보겠습니다 . @JsonView 주석을 활용 하여 API 수준에서 JSON 응답을 사용자 지정할 수 있습니다 .

다음 예제에서-우리는 응답 하기 위해 Public 뷰를 사용했습니다 .

@JsonView(Views.Public.class) @RequestMapping("/items/{id}") public Item getItemPublic(@PathVariable int id) { return ItemManager.getById(id); }

응답은 다음과 같습니다.

{"id":2,"itemName":"book"}

그리고 다음과 같이 내부 보기를 사용했을 때 :

@JsonView(Views.Internal.class) @RequestMapping("/items/internal/{id}") public Item getItemInternal(@PathVariable int id) { return ItemManager.getById(id); }

그 응답이었습니다.

{"id":2,"itemName":"book","ownerName":"John"}

Spring 4.1에서 뷰를 사용하는 방법에 대해 자세히 알아 보려면 Spring 4.1의 Jackson 개선 사항을 확인해야합니다.

7. 결론

이 빠른 자습서에서는 Jackson JSON 뷰와 @JsonView 주석을 살펴 보았습니다. 단일 또는 다중보기를 사용하여 JSON보기를 사용하여 직렬화 / 역 직렬화 프로세스를 세밀하게 제어하는 ​​방법을 보여주었습니다.

이 튜토리얼의 전체 코드는 GitHub에서 찾을 수 있습니다.

잭슨 바닥

방금 Spring 5 및 Spring Boot 2의 기본 사항에 초점을 맞춘 새로운 Learn Spring 과정을 발표했습니다 .

>> 과정 확인