回答編集履歴
1
クラス名を質問側に合わせる、他細かいミス
answer
CHANGED
@@ -1,44 +1,50 @@
|
|
1
1
|
カスタムDeserializerクラスを定義するしかないと思います。
|
2
2
|
|
3
3
|
```lang-java
|
4
|
-
@Data public class
|
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
|
11
|
+
public class ArtistmatchesDeserializer implements JsonDeserializer<Artistmatches> {
|
12
12
|
|
13
|
-
@Override public
|
13
|
+
@Override public Artistmatches deserialize(JsonElement json, Type typeOfT,
|
14
14
|
JsonDeserializationContext context) throws JsonParseException {
|
15
15
|
|
16
|
-
|
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
|
-
//
|
23
|
+
// objectならデシリアライズ後に要素数1のリストにする
|
23
24
|
Artist artist = context.deserialize(artistElement, Artist.class);
|
24
|
-
|
25
|
+
artists = Lists.newArrayList(artist);
|
25
26
|
} else if (artistElement.isJsonArray()) {
|
26
|
-
//
|
27
|
+
// arrayなら普通にデシリアライズ
|
27
28
|
Type type = new TypeToken<ArrayList<Artist>>() {
|
28
29
|
}.getType();
|
29
|
-
|
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
|
38
|
+
return artistmatches;
|
35
39
|
}
|
36
40
|
}
|
37
41
|
```
|
38
42
|
|
39
43
|
```lang-java
|
40
|
-
//
|
44
|
+
// Deserializerを登録
|
45
|
+
Gson gson = new GsonBuilder()
|
41
|
-
|
46
|
+
.registerTypeAdapter(Artistmatches.class, new ArtistmatchesDeserializer())
|
47
|
+
.create();
|
42
48
|
```
|
43
49
|
|
44
50
|
実際に動作確認はしていないのでそのままだと動かないかもしれませんが、方針としてはこんな感じで実現可能だと思います。
|