У меня есть базовое приложение SpringBoot 2.1.5.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в виде исполняемого файла JAR с некоторыми RestControllers.
В 1 контроллере это тело, которое я отправляю:
{
"depositHotel": "xxx",
"destinationHotel": "aaa",
"depositHotelAmount": "0.2",
"destinationHotelAmount": "4",
"destinationAddress": [{
"address": "asdf",
"tag": ""
}],
"refundAddress": [{
"address": "pio",
"tag": ""
}]
}
поэтому я создаю этот класс, чтобы использовать его как RequestBody:
public class HotelswitchHotelOrderRequestBody {
public static class Builder {
private String depositHotel;
private String destinationHotel;
private Float depositHotelAmount;
private Float destinationHotelAmount;
private JSONObject destinationAddress;
private JSONObject refundAddress;
public Builder(String depositHotel, String destinationHotel) {
this.depositHotel = depositHotel;
this.destinationHotel = destinationHotel;
}
public Builder withDepositHotelAmount (Float depositHotelAmount) {
this.depositHotelAmount = depositHotelAmount;
return this;
}
public Builder withDestinationHotelAmount (Float destinationHotelAmount) {
this.destinationHotelAmount = destinationHotelAmount;
return this;
}
public Builder toDestinationAddress (JSONObject destinationAddress) {
this.destinationAddress = destinationAddress;
return this;
}
public Builder toRefundAddress (JSONObject refundAddress) {
this.refundAddress = refundAddress;
return this;
}
public HotelswitchHotelOrderRequestBody build(){
HotelswitchHotelOrderRequestBody order = new HotelswitchHotelOrderRequestBody();
order.depositHotel = this.depositHotel;
order.depositHotelAmount = this.depositHotelAmount;
order.destinationAddress = this.destinationAddress;
order.destinationHotel = this.destinationHotel;
order.destinationHotelAmount = this.destinationHotelAmount;
order.refundAddress = this.refundAddress;
return order;
}
}
private String depositHotel;
private String destinationHotel;
private Float depositHotelAmount;
private Float destinationHotelAmount;
private JSONObject destinationAddress;
private JSONObject refundAddress;
private HotelswitchHotelOrderRequestBody () {
//Constructor is now private.
}
public String getDepositHotel() {
return depositHotel;
}
public void setDepositHotel(String depositHotel) {
this.depositHotel = depositHotel;
}
public String getDestinationHotel() {
return destinationHotel;
}
public void setDestinationHotel(String destinationHotel) {
this.destinationHotel = destinationHotel;
}
public Float getDepositHotelAmount() {
return depositHotelAmount;
}
public void setDepositHotelAmount(Float depositHotelAmount) {
this.depositHotelAmount = depositHotelAmount;
}
public Float getDestinationHotelAmount() {
return destinationHotelAmount;
}
public void setDestinationHotelAmount(Float destinationHotelAmount) {
this.destinationHotelAmount = destinationHotelAmount;
}
public JSONObject getDestinationAddress() {
return destinationAddress;
}
public void setDestinationAddress(JSONObject destinationAddress) {
this.destinationAddress = destinationAddress;
}
public JSONObject getRefundAddress() {
return refundAddress;
}
public void setRefundAddress(JSONObject refundAddress) {
this.refundAddress = refundAddress;
}
}
Но у меня есть эта ошибка при получении объекта:
JSON parse error: out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `org.json.JSONObject` out of START_ARRAY token
Предоставленный вами json недействителен.
nuñito ostia, оба адреса на самом деле являются массивами в вашем json, и некоторые кавычки неверны, хотя, возможно, это было при копировании сюда
вы говорите «тело, которое я ожидаю», но не могли бы вы отправить реальное тело, которое вы отправляете?
В сообщении сказано все. destinationAddress и returnAddress в вашем JSON являются массивами, а не объектами.
Этот JSON полностью действителен.
почему вы хотите сопоставить «destinationAddress» с JSONObject вместо класса pojo? Есть ли особая причина для его захвата в JSONObject?
Представление JSONObject
в реальном JSON — это хэш, т.е. {...}
. В ваших данных json вы предоставляете массив хэшей [{...}]
, который не совпадает. Судя по вашему домену, я не думаю, что это должно быть несколько значений, поэтому вы можете просто опустить []
в своей полезной нагрузке, и если это так, то поля в вашем классе Java могут быть определены как JSONArray.
Тем не менее, я думаю, вам следует определить класс Address
и либо использовать
private Address destinationAddress;
private Address refundAddress;
или если это действительно должен быть массив объектов
private List<Address> destinationAddresses;
private List<Address> refundAddresses;
У меня был аналогичный вариант использования, когда я не мог определить json для POJO. Использование com.fasterxml.jackson.databind.JsonNode
вместо JSONObject
сработало.
Попробуйте JSONArray вместо JSONObject