1概要

このチュートリアルでは、Jackson JSONビューを使用してオブジェクトをシリアライズ/デシリアライズし、ビューをカスタマイズし、最後にSpringとの統合を開始する方法について説明します。


2 JSONビューを使用したシリアライズ

まず、簡単な例を見てみましょう。

これが私たちの見解です。

public class Views {
    public static class Public {
    }
}

そして、 ”

User

“エンティティ:

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 class Views {
    public static class Public {
    }

    public static class Internal extends Public {
    }
}

そしてここに私たちのエンティティ ”

Item

“があります。フィールド

id



name

だけがパブリックビューに含まれています:

public class Item {

    @JsonView(Views.Public.class)
    public int id;

    @JsonView(Views.Public.class)
    public String itemName;

    @JsonView(Views.Internal.class)
    public String ownerName;
}


Public

ビューを使用してシリアル化すると、

id



name

のみが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")));
}

しかし、

Internal

ビューを使用してシリアル化を実行すると、すべてのフィールドは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());
}

特定のビューを使用して

ReaderWithView()

APIを使用して

ObjectReader

を作成していることに注意してください。


5 JSONビューをカスタマイズする

次に、JSONビューをカスタマイズする方法を見てみましょう。次の例では、シリアル化の結果に

User



name

” UpperCaseを追加します。

JSONビューをカスタマイズするために

BeanPropertyWriter

とBeanSerializerModifierを使います。まず、

User


name

を大文字に変換するための

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

そしてここに、

User

name

BeanPropertyWriter

をカスタムの

UpperCasingWriter

で設定するための

BeanSerializerModifier

があります。

public class MyBeanSerializerModifier extends BeanSerializerModifier{

    @Override
    public List<BeanPropertyWriter> changeProperties(
      SerializationConfig config, BeanDescription beanDesc,
      List<BeanPropertyWriter> 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;
    }
}

それでは、修正したシリアライザを使用して

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

そして、次のように

Internal

ビューを使用したとします。

@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でビューをもっと深く使いたいのなら、http://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-springをご覧ください。春4.1]。


7. 結論

このクイックチュートリアルでは、Jackson JSONビューと@JsonViewアノテーションを見ました。単一または複数のビューを使用して、JSONビューを使用してシリアライズ/デシリアライズプロセスをきめ細かく制御する方法を示しました。