Jackson JSON Views

Jackson Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Dalam tutorial ini, kita akan membahas cara menggunakan Jackson JSON Views untuk membuat serial / deserialisasi objek, menyesuaikan tampilan, dan terakhir - cara mulai berintegrasi dengan Spring.

2. Serialisasi Menggunakan JSON Views

Pertama - mari kita lihat contoh sederhana - membuat serial objek dengan @JsonView .

Inilah pandangan kami:

public class Views { public static class Public { } }

Dan entitas " Pengguna ":

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

Sekarang mari membuat serial instance " User " menggunakan view kita:

@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"))); }

Perhatikan caranya, karena kami membuat serial dengan tampilan tertentu aktif, kami hanya melihat bidang yang tepat yang diserialisasi .

Penting juga untuk dipahami, bahwa - secara default - semua properti yang tidak secara eksplisit ditandai sebagai bagian dari tampilan, dibuat berseri. Kami menonaktifkan perilaku itu dengan fitur DEFAULT_VIEW_INCLUSION yang praktis .

3. Gunakan Beberapa Tampilan JSON

Selanjutnya - mari kita lihat cara menggunakan beberapa Tampilan JSON - masing-masing memiliki kolom yang berbeda seperti pada contoh berikut:

Di sini kita harus melihat di mana Internal memperluas Publik , dengan tampilan internal memperluas publik:

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

Dan inilah entitas kami " Item " di mana hanya id dan nama bidang yang disertakan dalam tampilan Publik :

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

Jika kita menggunakan tampilan Publik untuk membuat serial - hanya id dan nama yang akan diserialkan ke 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"))); }

Tetapi jika kita menggunakan tampilan Internal untuk melakukan serialisasi, semua bidang akan menjadi bagian dari keluaran 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. Deserialisasi Menggunakan Tampilan JSON

Sekarang - mari kita lihat bagaimana menggunakan JSON Views untuk menghilangkan nama objek - khususnya, sebuah User instance:

@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()); }

Perhatikan bagaimana kami menggunakan API readerWithView () untuk membuat ObjectReader menggunakan tampilan yang diberikan.

5. Sesuaikan Tampilan JSON

Selanjutnya - mari kita lihat cara menyesuaikan Tampilan JSON. Pada contoh berikutnya - kami ingin membuat " nama " Pengguna UpperCase di hasil serialisasi.

Kami akan menggunakan BeanPropertyWriter dan BeanSerializerModifier untuk menyesuaikan tampilan JSON kami. Pertama - inilah BeanPropertyWriter UpperCasingWriter untuk mengubah nama Pengguna menjadi huruf besar:

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); } }

Dan berikut adalah BeanSerializerModifier untuk menetapkan nama Pengguna BeanPropertyWriter dengan UpperCasingWriter kustom kami :

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; } }

Sekarang - mari membuat serial instance User menggunakan Serializer yang dimodifikasi:

@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. Menggunakan JSON Views With Spring

Terakhir - mari kita lihat sekilas penggunaan tampilan JSON dengan Spring Framework . Kita dapat memanfaatkan anotasi @JsonView untuk menyesuaikan respons JSON kita di level API.

Dalam contoh berikut - kami menggunakan tampilan Publik untuk merespons:

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

Tanggapannya adalah:

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

Dan saat kami menggunakan tampilan Internal sebagai berikut:

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

Itulah tanggapannya:

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

Jika Anda ingin menyelami lebih dalam menggunakan pemandangan dengan Spring 4.1, Anda harus melihat perbaikan Jackson di Spring 4.1.

7. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat tampilan Jackson JSON dan anotasi @JsonView. Kami menunjukkan cara menggunakan Tampilan JSON untuk memiliki kontrol yang sangat baik atas proses serialisasi / deserialisasi kami - menggunakan satu atau beberapa tampilan.

Kode lengkap untuk tutorial ini dapat ditemukan di GitHub.

Jackson bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya