JSON 解析错误:无法从 START_ARRAY 令牌中反序列化 `` 的实例

Dud*_*tor 1 java json jackson spring-boot

我是 Spring Boot 和 API 的新手,我正在开发一个项目,尽管我的 Spring Boot 应用程序与 MySQL 数据库连接,但我需要从公共 API 获取数据并将其存储到本地数据库。从 API 获取数据时,我的编译器抛出异常:

\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
\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]\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,我的CurrencyDTO 类:

\n
public 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\n
Run Code Online (Sandbox Code Playgroud)\n

费率.java

\n
public class Rates {\n    \n    private String currency;\n    private Map<String, Double> price;\n\n    // Getters and Setters, No-arg/arg constractor\n
Run Code Online (Sandbox Code Playgroud)\n

我调用 API 的代码段:

\n
try {\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        }\n
Run Code Online (Sandbox Code Playgroud)\n

控制器类:

\n
@GetMapping("/currency")\n    public List<Currency> findAll(){\n        return currencyService.getAllCurrencies();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

ama*_*kha 5

另外,您共享的 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   }\n
Run 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}\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它能够为我反序列化。\n你做错的是 Dto 实例变量应该根据 Json 中的名称,或者你应该使用@JsonProperty("nameInTheJson")

\n\n

如果你想让它与你的 JSON 兼容,你可以使用 Array ofCurrencyDTO\n你将能够反序列化,你可以将该对象用作,

\n\n
try {\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        }\n
Run Code Online (Sandbox Code Playgroud)\n