簡體   English   中英

使用 Jackson 反序列化復雜的 JSON 響應

[英]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&apos;Italia, 1",
            "city":"Reggio nell&apos;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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM