1概要

このチュートリアルでは、JSON ArrayをJackson 2 ** でJava ArrayまたはCollectionにデシリアライズする方法を示します。

あなたがもっと深く掘り下げて

あなたがジャクソン2

ですることができる** 他のクールなことを学びたいなら –

メインのジャクソンチュートリアル

に向かって進んでください。


2配列への非整列化

ジャクソンは簡単にJava配列に逆シリアル化することができます:

@Test
public void givenJsonArray__whenDeserializingAsArray__thenCorrect()
  throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

   //[{"stringValue":"a","intValue":1,"booleanValue":true},
   //{"stringValue":"bc","intValue":3,"booleanValue":false}]
    MyDto[]asArray = mapper.readValue(jsonArray, MyDto[].class);
    assertThat(asArray[0], instanceOf(MyDto.class));
}


3コレクションへのアンマーシャル

同じJSON配列をJavaコレクションに読み込むのはもう少し困難です。デフォルトでは、

Jacksonは総称型情報を取得できません

代わりにLinked

__HashMap

__インスタンスのコレクションを作成します。

@Test
public void givenJsonArray__whenDeserializingAsListWithNoTypeInfo__thenNotCorrect()
  throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new ObjectMapper();

    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List<MyDto> asList = mapper.readValue(jsonArray, List.class);
    assertThat((Object) asList.get(0), instanceOf(LinkedHashMap.class));
}

ジャクソンが正しい型情報を理解するのを助ける2つの方法があります – この目的のためにライブラリが提供する

TypeReference

を使うことができます。

@Test
public void givenJsonArray__whenDeserializingAsListWithTypeReferenceHelp__thenCorrect()
  throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new ObjectMapper();

    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    List<MyDto> asList = mapper.readValue(
      jsonArray, new TypeReference<List<MyDto>>() { });
    assertThat(asList.get(0), instanceOf(MyDto.class));
}

あるいは、

JavaType

を受け入れるオーバーロードされた

readValue

メソッドを使用することもできます。

@Test
publi void givenJsonArray__whenDeserializingAsListWithJavaTypeHelp__thenCorrect()
  throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();

    List<MyDto> listOfDtos = Lists.newArrayList(
      new MyDto("a", 1, true), new MyDto("bc", 3, false));
    String jsonArray = mapper.writeValueAsString(listOfDtos);

    CollectionType javaType = mapper.getTypeFactory()
      .constructCollectionType(List.class, MyDto.class);
    List<MyDto> asList = mapper.readValue(jsonArray, javaType);

    assertThat(asList.get(0), instanceOf(MyDto.class));
}

最後の注意点は、

MyDto

クラスには引数なしのデフォルトコンストラクタが必要だということです。そうでなければ、

Jacksonはそれをインスタンス化できません

com.fasterxml.jackson.databind.JsonMappingException:
No suitable constructor found for type[simple type, class org.baeldung.jackson.ignore.MyDto]:
can not instantiate from JSON object (need to add/enable type information?)


4結論

JSON配列をJavaコレクションにマッピングすることは、Jacksonが使用している最も一般的なタスクの1つです。これらのソリューションは、型保証された正しいマッピングを取得するために不可欠です。

これらすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/jackson#readme

にあります。

– これはMavenベースのプロジェクトです。インポートしてそのまま実行するのは簡単なはずです。