teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

クラス名を質問側に合わせる、他細かいミス

2015/06/09 05:39

投稿

YukiYoshida
YukiYoshida

スコア93

answer CHANGED
@@ -1,44 +1,50 @@
1
1
  カスタムDeserializerクラスを定義するしかないと思います。
2
2
 
3
3
  ```lang-java
4
- @Data public class SearchResult {
4
+ @Data public class Artistmatches {
5
5
 
6
6
  private List<Artist> artists;
7
7
  }
8
8
  ```
9
9
 
10
10
  ```lang-java
11
- public class SearchResultDeserializer implements JsonDeserializer<SearchResult> {
11
+ public class ArtistmatchesDeserializer implements JsonDeserializer<Artistmatches> {
12
12
 
13
- @Override public SearchResult deserialize(JsonElement json, Type typeOfT,
13
+ @Override public Artistmatches deserialize(JsonElement json, Type typeOfT,
14
14
  JsonDeserializationContext context) throws JsonParseException {
15
15
 
16
- SearchResult searchResult = new SearchResult();
16
+ Artistmatches artistmatches = new Artistmatches();
17
17
 
18
18
  JsonObject obj = (JsonObject) json;
19
19
 
20
20
  JsonElement artistElement = obj.get("artist");
21
+ List<Artist> artists;
21
22
  if (artistElement.isJsonObject()) {
22
- // json objectならデシリアライズ後に要素数1のリストとしてjavaオブジェクト入れ
23
+ // objectならデシリアライズ後に要素数1のリストに
23
24
  Artist artist = context.deserialize(artistElement, Artist.class);
24
- searchResult.setArtists(Lists.newArrayList(artist));
25
+ artists = Lists.newArrayList(artist);
25
26
  } else if (artistElement.isJsonArray()) {
26
- // json arrayなら普通にデシリアライズ
27
+ // arrayなら普通にデシリアライズ
27
28
  Type type = new TypeToken<ArrayList<Artist>>() {
28
29
  }.getType();
29
- searchResult.setArtists((ArrayList<Artist>) context.deserialize(artistElement, type));
30
+ artists = (ArrayList<Artist>) context.deserialize(artistElement, type);
31
+ } else {
32
+ artists = new ArrayList<>();// or null 好きなように
30
33
  }
34
+ artistmatches.setArtists(artists);
31
35
 
32
36
  // 他のjsonの項目をデシリアライズするコード ...
33
37
 
34
- return searchResult;
38
+ return artistmatches;
35
39
  }
36
40
  }
37
41
  ```
38
42
 
39
43
  ```lang-java
40
- // gsonからSearchResultDeserializer使うように設定
44
+ // Deserializer登録
45
+ Gson gson = new GsonBuilder()
41
- Gson gson = new GsonBuilder().registerTypeAdapter(SearchResult.class, new SearchResultDeserializer()).create();
46
+ .registerTypeAdapter(Artistmatches.class, new ArtistmatchesDeserializer())
47
+ .create();
42
48
  ```
43
49
 
44
50
  実際に動作確認はしていないのでそのままだと動かないかもしれませんが、方針としてはこんな感じで実現可能だと思います。