Dud*_*tor 1 java json jackson spring-boot
我是 Spring Boot 和 API 的新手,我正在开发一个项目,尽管我的 Spring Boot 应用程序与 MySQL 数据库连接,但我需要从公共 API 获取数据并将其存储到本地数据库。从 API 获取数据时,我的编译器抛出异常:
\n\n\n提取类型 [class com.currencyExchangeRates.models.CurrencyDTO] 和内容类型 [application/json;charset=utf-8] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法从 START_ARRAY 令牌中反序列化“com.currencyExchangeRates.models.CurrencyDTO”实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_ARRAY 令牌\nat 中反序列化“com.currencyExchangeRates.models.CurrencyDTO”实例 [来源:(PushbackInputStream);行:1,列:1]
\n
我的总体想法是从公共API获取数据并将其存储在本地数据库中,然后根据我的项目需求使用这些数据。
\n我几乎尝试了 Google 和 Stack Overflow 的所有解决方案,但我没有任何想法。
\n我试图获取的 JSON 格式:
\n[\n {\n "table":"A",\n "no":"237/A/NBP/2019",\n "effectiveDate":"2019-12-09",\n "rates":[\n {\n "currency":"bat (Tajlandia)",\n "code":"THB",\n "mid":0.1277\n },\n {\n "currency":"dolar ameryka\xc5\x84ski",\n "code":"USD",\n "mid":3.8704\n }\n ]\n }\n]\nRun Code Online (Sandbox Code Playgroud)\n在这里,我的CurrencyDTO 类:
\npublic class CurrencyDTO {\n\n private String table;\n private String num;\n private String date;\n \n private Rates rates;\n\n // Getters and Setters, No-arg/arg constractor\nRun Code Online (Sandbox Code Playgroud)\n费率.java
\npublic class Rates {\n \n private String currency;\n private Map<String, Double> price;\n\n // Getters and Setters, No-arg/arg constractor\nRun Code Online (Sandbox Code Playgroud)\n我调用 API 的代码段:
\ntry {\n RestTemplate restTemplate = new RestTemplate();\n \n CurrencyDTO forObject = \n restTemplate.getForObject("http://api.nbp.pl/api/exchangerates/tables/a/", CurrencyDTO.class);\n \n forObject.getRates().getPrice().forEach((key, value) -> {\n Currency currency = new Currency(key, value);\n this.currencyRepository.save(currency); \n });\n }catch (RestClientException ex) {\n System.out.println(ex.getMessage());\n }\nRun Code Online (Sandbox Code Playgroud)\n控制器类:
\n@GetMapping("/currency")\n public List<Currency> findAll(){\n return currencyService.getAllCurrencies();\n }\nRun Code Online (Sandbox Code Playgroud)\n
另外,您共享的 json 是一个CurrencyDTO 数组。假设你的 Json 是,
\n\n {\n "table":"A",\n "no":"237/A/NBP/2019",\n "effectiveDate":"2019-12-09",\n "rates":[\n {\n "currency":"bat (Tajlandia)",\n "code":"THB",\n "mid":0.1277\n },\n {\n "currency":"dolar ameryka\xc5\x84ski",\n "code":"USD",\n "mid":3.8704\n }\n ]\n }\nRun Code Online (Sandbox Code Playgroud)\n\n将您的CurrencyDTO更改为,
\n\n@Data\n@NoArgsConstructor\npublic class CurrencyDTO {\n\n private String table;\n private String no;\n private String effectiveDate;\n\n private List<Rates> rates;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n以及您的费率类别,
\n\n@Data\n@NoArgsConstructor\npublic class Rates {\n\n private String currency;\n private String code;\n private Double mid;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n它能够为我反序列化。\n你做错的是 Dto 实例变量应该根据 Json 中的名称,或者你应该使用@JsonProperty("nameInTheJson")。
\n\n如果你想让它与你的 JSON 兼容,你可以使用 Array ofCurrencyDTO\n你将能够反序列化,你可以将该对象用作,
\n\ntry {\n RestTemplate restTemplate = new RestTemplate();\n\n CurrencyDTO[] forObject =\n restTemplate.getForEntity("http://api.nbp.pl/api/exchangerates/tables/a/", CurrencyDTO[].class).getBody();\n for (CurrencyDTO currencyDTO1 : forObject) {\n for (Rates rate : currencyDTO1.getRates()) {\n Currency currency = new Currency(rate.getCode(), rate.getMid());\n //you code to put the object inside the db\n this.currencyRepository.save(currency);\n }\n }\n }catch (Exception ex) {\n System.out.println(ex.getMessage());\n }\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
25902 次 |
| 最近记录: |