【问题标题】:Deserializing JSON response with list of NAMED objects使用 NAMED 对象列表反序列化 JSON 响应
【发布时间】:2020-11-28 11:05:19
【问题描述】:

我正在编写一个 Spring Boot 应用程序,它处理返回以下响应模式的 REST API:

{
  "id": 550,
  "results": {
    "AR": {
      "link": "https://www.themoviedb.org/movie/550-fight-club/watch?locale=AR",
      "flatrate": [
        {
          "display_priority": 1,
          "logo_path": "/68MNrwlkpF7WnmNPXLah69CR5cb.jpg",
          "provider_id": 119,
          "provider_name": "Amazon Prime Video"
        },
        {
          "display_priority": 7,
          "logo_path": "/rgbalNWbAuhWklHH5JAnF53Wjey.jpg",
          "provider_id": 339,
          "provider_name": "Movistar Play"
        }
      ],
      "rent": [
        {
          "display_priority": 2,
          "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg",
          "provider_id": 2,
          "provider_name": "Apple iTunes"
        },
        {
          "display_priority": 3,
          "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg",
          "provider_id": 3,
          "provider_name": "Google Play Movies"
        },
        {
          "display_priority": 8,
          "logo_path": "/mzu37NQphDvqN2BHKM0Rwq9Es3r.jpg",
          "provider_id": 167,
          "provider_name": "Claro video"
        }
      ],
      "buy": [
        {
          "display_priority": 2,
          "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg",
          "provider_id": 2,
          "provider_name": "Apple iTunes"
        },
        {
          "display_priority": 3,
          "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg",
          "provider_id": 3,
          "provider_name": "Google Play Movies"
        }
      ]
    },
    "AT": {
      "link": "https://www.themoviedb.org/movie/550-fight-club/watch?locale=AT",
      "rent": [
        {
          "display_priority": 2,
          "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg",
          "provider_id": 2,
          "provider_name": "Apple iTunes"
        },
        {
          "display_priority": 3,
          "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg",
          "provider_id": 3,
          "provider_name": "Google Play Movies"
        },
        {
          "display_priority": 7,
          "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg",
          "provider_id": 40,
          "provider_name": "Chili"
        },
        {
          "display_priority": 8,
          "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg",
          "provider_id": 130,
          "provider_name": "Sky Store"
        },
        {
          "display_priority": 10,
          "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg",
          "provider_id": 10,
          "provider_name": "Amazon Video"
        },
        {
          "display_priority": 14,
          "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg",
          "provider_id": 20,
          "provider_name": "maxdome Store"
        },
        {
          "display_priority": 18,
          "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg",
          "provider_id": 35,
          "provider_name": "Rakuten TV"
        },
        {
          "display_priority": 37,
          "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg",
          "provider_id": 68,
          "provider_name": "Microsoft Store"
        }
      ],
      "buy": [
        {
          "display_priority": 2,
          "logo_path": "/q6tl6Ib6X5FT80RMlcDbexIo4St.jpg",
          "provider_id": 2,
          "provider_name": "Apple iTunes"
        },
        {
          "display_priority": 3,
          "logo_path": "/p3Z12gKq2qvJaUOMeKNU2mzKVI9.jpg",
          "provider_id": 3,
          "provider_name": "Google Play Movies"
        },
        {
          "display_priority": 7,
          "logo_path": "/vjKeS7Y9fNyqNtvp2ROCc71iu1u.jpg",
          "provider_id": 40,
          "provider_name": "Chili"
        },
        {
          "display_priority": 8,
          "logo_path": "/pZgeSWpfvD59x6sY6stT5c6uc2h.jpg",
          "provider_id": 130,
          "provider_name": "Sky Store"
        },
        {
          "display_priority": 10,
          "logo_path": "/sVBEF7q7LqjHAWSnKwDbzmr2EMY.jpg",
          "provider_id": 10,
          "provider_name": "Amazon Video"
        },
        {
          "display_priority": 14,
          "logo_path": "/mosNtwHNCqCmjk7n5odKgYYf2GI.jpg",
          "provider_id": 20,
          "provider_name": "maxdome Store"
        },
        {
          "display_priority": 18,
          "logo_path": "/wuViyDkbFp4r7VqI0efPW5hFfQj.jpg",
          "provider_id": 35,
          "provider_name": "Rakuten TV"
        },
        {
          "display_priority": 37,
          "logo_path": "/paq2o2dIfQnxcERsVoq7Ys8KYz8.jpg",
          "provider_id": 68,
          "provider_name": "Microsoft Store"
        }
      ]
    }
... like 50 more of the above ...
  }
}

在尝试编写 DTO 类来捕获此响应时,我意识到由于“结果”字段的内容就像一个地图,我不知道如何为它编写 DTO 对象的组合。通常我会写类似“:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ProviderSearchResultDto {

    @JsonProperty("id")
    private Long id;

    @JsonProperty("results")
    private List<CountryResultDto> results;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class CountryResultDto {

    @JsonProperty("link")
    private String link;

    @JsonProperty("flatrate")
    private List<ResultDto> result;

    @JsonProperty("rent")
    private List<ResultDto> rent;

    @JsonProperty("buy")
    private List<ResultDto> buy;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResultDto {

    @JsonProperty("display_priority")
    private int displayPriority;

    @JsonProperty("logo_path")
    private String logoPath;

    @JsonProperty("provider_id")
    private int providerId;

    @JsonProperty("provider_name")
    private int providerName;
}

但是因为在响应结果中就像一个命名实体的集合,我不知道该怎么做。有人吗?

【问题讨论】:

    标签: java json spring spring-boot hibernate


    【解决方案1】:

    你需要做类似的事情:

    public class Result {
        private AR ar;
        private At at;
    }
    
    public class AR {
        private List<Flatrate> flatRate;
        private List<Rent> rent;
        private List<Buy> buy;
    }
    
    public class AT {
        private List<Rent> rent;
        private List<Buy> buy;
    }
    
    
    public class Flatrate {
     private Integer displayPriority;
         ....
    }
    
    public class Rent{
         ....
    }
    
    public class Buy{
         ....
    }
    

    您可以使用此https://www.freecodeformat.com/json2pojo.php 站点将 JSON 转换为 java 对象。它更容易。

    还有这个https://jsoneditoronline.org/ 将 JSON 视为树格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多