Не удается десериализовать экземпляр `org.json.JSONObject`

У меня есть базовое приложение 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

Попробуйте JSONArray вместо JSONObject

Nikita Ryanov 27.05.2019 22:36

Предоставленный вами json недействителен.

Michał Krzywański 27.05.2019 22:40

nuñito ostia, оба адреса на самом деле являются массивами в вашем json, и некоторые кавычки неверны, хотя, возможно, это было при копировании сюда

aran 27.05.2019 22:50

вы говорите «тело, которое я ожидаю», но не могли бы вы отправить реальное тело, которое вы отправляете?

Perimosh 27.05.2019 23:40

В сообщении сказано все. destinationAddress и returnAddress в вашем JSON являются массивами, а не объектами.

JB Nizet 27.05.2019 23:44

Этот JSON полностью действителен.

Perimosh 28.05.2019 15:36

почему вы хотите сопоставить «destinationAddress» с JSONObject вместо класса pojo? Есть ли особая причина для его захвата в JSONObject?

Naveen 30.05.2019 00:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
523
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Представление 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 сработало.

Другие вопросы по теме