Paparan Jackson JSON

Jackson Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membahas cara menggunakan Jackson JSON Views untuk membuat siri / deserialisasi objek, menyesuaikan pandangan dan akhirnya - bagaimana untuk mula berintegrasi dengan Spring.

2. Bersiri Menggunakan Pandangan JSON

Pertama - mari kita pergi melalui contoh yang mudah - cerita bersambung objek dengan @JsonView .

Inilah pandangan kami:

public class Views { public static class Public { } }

Dan entiti " Pengguna ":

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

Sekarang mari kita bersiri contoh " Pengguna " menggunakan pandangan 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, kerana kita bersiri dengan pandangan tertentu yang aktif, kita hanya melihat bidang yang betul yang bersiri .

Penting juga untuk difahami, bahawa - secara lalai - semua sifat yang tidak ditandakan secara eksplisit sebagai sebahagian daripada pandangan, bersiri. Kami melumpuhkan tingkah laku itu dengan ciri DEFAULT_VIEW_INCLUSION yang berguna .

3. Gunakan Pelbagai Paparan JSON

Seterusnya - mari kita lihat bagaimana menggunakan beberapa Paparan JSON - masing-masing mempunyai bidang yang berbeza seperti contoh berikut:

Di sini kita harus melihat di mana Dalaman meluas kepada Umum , dengan pandangan dalaman meluas kepada umum:

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

Dan inilah entiti kami " Item " di mana hanya id dan nama bidang yang disertakan dalam paparan Umum :

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

Sekiranya kita menggunakan paparan Umum untuk bersiri - hanya id dan nama yang akan diselaraskan 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 paparan Dalaman untuk melakukan serialisasi, semua bidang akan menjadi sebahagian daripada output 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 Paparan JSON

Sekarang - mari kita lihat bagaimana menggunakan JSON Views untuk deserialisasi objek - khususnya, contoh Pengguna :

@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 kita menggunakan readerWithView () API untuk membuat ObjectReader menggunakan pandangan yang diberikan.

5. Sesuaikan Paparan JSON

Seterusnya - mari lihat cara menyesuaikan Paparan JSON. Dalam contoh seterusnya - kami ingin menjadikan Pengguna " nama " UpperCase dalam hasil siri.

Kami akan menggunakan BeanPropertyWriter dan BeanSerializerModifier untuk menyesuaikan pandangan 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 inilah BeanSerializerModifier untuk menetapkan nama Pengguna BeanPropertyWriter dengan UpperCasingWriter tersuai 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 kita sirikan contoh Pengguna menggunakan Serializer yang diubah suai:

@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 Pandangan JSON Dengan Musim Bunga

Akhirnya - mari kita lihat dengan cepat menggunakan pandangan JSON dengan Spring Framework . Kami dapat memanfaatkan anotasi @JsonView untuk menyesuaikan respons JSON kami di peringkat API.

Dalam contoh berikut - kami menggunakan paparan Umum untuk bertindak balas:

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

Responsnya adalah:

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

Dan ketika kami menggunakan paparan Dalaman seperti berikut:

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

Itu adalah tindak balas:

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

Sekiranya anda ingin menyelami lebih mendalam menggunakan pemandangan dengan Spring 4.1, anda harus melihat peningkatan Jackson pada Spring 4.1.

7. Kesimpulannya

Dalam tutorial ringkas ini, kami melihat paparan Jackson JSON dan anotasi @JsonView. Kami menunjukkan cara menggunakan JSON Views untuk mempunyai kawalan yang lebih baik terhadap proses bersiri / deserialisasi kami - menggunakan satu atau beberapa paparan.

Kod lengkap untuk tutorial ini boleh didapati di GitHub.

Bahagian bawah Jackson

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

>> SEMAK KURSUS