![](/img/trans.png)
[英]IndexOutOfBoundException while Deserializing a json response using jackson
[英]Deserializing complex JSON response using Jackson
我正在使用 Spring 開發我的 Web 應用程序后端。 特別是,我的應用程序管理有關足球隊及其球員的數據。
我的應用程序與第三方 REST API 交互以獲取團隊和玩家數據。
至於團隊,我創建了一個Team
實體,如下所示:
@Data
@Table(name = "team")
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
private String name;
private String logoUrl;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "team")
private Set<Player> players;
}
但是,來自 API 的響應具有特定結構,並在“響應”節點中包含一組團隊。
這是響應的結構:
{
"get":"teams",
"parameters":{
"league":"135",
"season":"2020"
},
"errors":[
],
"results":20,
"paging":{
"current":1,
"total":1
},
"response":[
{
"team":{
"id":487,
"name":"Lazio",
"country":"Italy",
"founded":1900,
"national":false,
"logo":"https:\/\/media.api-sports.io\/football\/teams\/487.png"
},
"venue":{
"id":910,
"name":"Stadio Olimpico",
"address":"Viale dei Gladiatori, 2 \/ Via del Foro Italico",
"city":"Roma",
"capacity":68530,
"surface":"grass",
"image":"https:\/\/media.api-sports.io\/football\/venues\/910.png"
}
},
{
"team":{
"id":488,
"name":"Sassuolo",
"country":"Italy",
"founded":1922,
"national":false,
"logo":"https:\/\/media.api-sports.io\/football\/teams\/488.png"
},
"venue":{
"id":935,
"name":"MAPEI Stadium - Citt\u00e0 del Tricolore",
"address":"Piazza Azzuri d'Italia, 1",
"city":"Reggio nell'Emilia",
"capacity":23717,
"surface":"grass",
"image":"https:\/\/media.api-sports.io\/football\/venues\/935.png"
}
},
... // Other team objects
]
}
如何使用 Jackson 庫解析答案以獲取List<Team>
?
您應該為 Jackson 創建匹配結果結構的類,然后將這些類的實例轉換為您的Team
類。 對 JPA 實體和 Jackson 反序列化使用相同的類是一個壞主意。
有一些在線服務允許生成這樣的類。 例如這個https://json2csharp.com/json-to-pojo生成的類是這樣的:
// import com.fasterxml.jackson.databind.ObjectMapper; // version 2.11.1
// import com.fasterxml.jackson.annotation.JsonProperty; // version 2.11.1
/* ObjectMapper om = new ObjectMapper();
Root root = om.readValue(myJsonString), Root.class); */
public class Parameters{
public String league;
public String season;
}
public class Paging{
public int current;
public int total;
}
public class Team{
public int id;
public String name;
public String country;
public int founded;
public boolean national;
public String logo;
}
public class Venue{
public int id;
public String name;
public String address;
public String city;
public int capacity;
public String surface;
public String image;
}
public class Response{
public Team team;
public Venue venue;
}
public class Root{
public String get;
public Parameters parameters;
public List<Object> errors;
public int results;
public Paging paging;
public List<Response> response;
}
正如@Sankozi 所說,您可以為 json 反序列化對 Java pojo 進行建模。 然后使用 ObjectMapper 進行反序列化,例如:
ObjectMapper mapper = new ObjectMapper();
CollectionType javaType = mapper.getTypeFactory()
.constructCollectionType(List.class, Response.class);
List<Response> asList = mapper.readValue(jsonArray, javaType);
List<Team> teams = asList.stream()
.flatMap(response -> response.getTeam())
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.