При преобразовании объекта в JSON Ошибка: com.fasterxml.jackson.databind.exc.MismatchedInputException

#java #json #objectmapper

#java #json #objectmapper

Вопрос:

Я пытаюсь преобразовать List<Object> в JSON формат, используя ObjectMapper . Я пробовал, как показано ниже, но я получаю исключение, т.е.

исключение com.fasterxml.jackson.databind.exc.MismatchedInputException:

     public List<ClientRT> callSP() throws IOException { 

            List<Object> crt=crtRepo.roomtype(60);          

            ObjectMapper mapper = new ObjectMapper();
            String json=mapper.writeValueAsString(crt);

            //ClientRT obj=mapper.readValue(json,ClientRT.class);

            List<ClientRT> obj=mapper.readValue(json,mapper.getTypeFactory()
                                                           .constructCollectionLikeType(List.class,ClientRT.class));
            return obj;
        }
 

Класс ClientRT

 public class ClientRT { 

    public Integer res_nclient_room_type_id;    
    public String res_sclient_rt_desc;
    public String  res_sclient_rt_name;
    public String res_sclient_rt_code;

    //getter setter

    public ClientRT() {
        super();
    }
    @Override
    public String toString() {
        return "ClientRT [res_nclient_room_type_id="   res_nclient_room_type_id   ", res_sclient_rt_desc="
                  res_sclient_rt_desc   ", res_sclient_rt_name="   res_sclient_rt_name   ", res_sclient_rt_code="
                  res_sclient_rt_code   "]";
    }
}
 

Ожидаемый результат в формате JSON

 [  
  { "res_nclient_room_type_id":1 ,   
    "res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "res_sclient_rt_code":"050" 
 },

]
 

Исключение

 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.spacestudy.model.ClientRT` out of START_ARRAY token
 at [Source: (String)"[[1,"TEMPORARILY NOT ASSIGNED","TEMPORARILY NOT ASSIGNED","000"],[2,"FACILITIES - AVAILABLE ROOM","FACILITIES - AVAILABLE ROOM","050"],[3,"FACILITIES - UNDEFINED PURPOSE","FACILITIES - UNDEFINED PURPOSE","060"],[4,"FACILITIES - UNFINISHED AREA","FACILITIES - UNFINISHED AREA","070"],[5,"CLASSROOM/LECTURE HALL","CLASSROOM/LECTURE HALL","110"],[6,"CLASSROOM SERVICE","CLASSROOM SERVICE","115"],[7,"CLASSROOM STORAGE","CLASSROOM STORAGE","116"],[8,"CLASSROOM KITCHEN","CLASSROOM KITCHEN","119"],[9,"CLA"[truncated 8500 chars]; line: 1, column: 2] (through reference chain: java.util.ArrayList[0])
 

Может кто-нибудь, пожалуйста, скажите мне, как я могу разрешить это исключение?

Комментарии:

1. Не могли бы вы опубликовать ClientRT класс? И пример json. Похоже, вы передаете Джексону неверный json

2. Я добавил класс и образец json

Ответ №1:

Как упоминалось amicoderozer выше, вам необходимо удалить тип данных полей class ClientRT из json, а не из класса.

Комментарии:

1. извините, я ошибочно добавил общедоступную строку в json. но это мой ожидаемый результат

2. Не могли бы вы, пожалуйста, указать, какой тип объектов List<Object> crt содержит?

3. Я вызываю хранимую функцию из postgresql, т.е. roomtype(60), т.е. простой выбор * из ClientRoomType

4. Объекты в списке List<Object> crt должны быть ClientRT объектами, иначе Джексон выбросит a MismatchedInputException .

5. crt содержит только объекты ClientRT . но я пытаюсь преобразовать объект в json

Ответ №2:

JSON, который вы передаете Джексону, неверен.

Вместо того, чтобы передавать Джексону этот Json:

 [  
  { "res_nclient_room_type_id":1 ,   
    "public String res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "public String  res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "public String res_sclient_rt_code":"050" 
 }
]
 

Попробуйте с этим (удалить public String из json):

 [  
  { "res_nclient_room_type_id":1 ,   
    "res_sclient_rt_desc": "FACILITIES - AVAILABLE ROOM",
    "res_sclient_rt_name":"FACILITIES - AVAILABLE ROOM" ,
    "res_sclient_rt_code":"050" 
  }
]
 

Джексон не может проанализировать json, потому что он не может найти соответствующее поле Java в классе ClientRT . Удалите public String из json и оставьте только имя поля класса ClientRT .

Комментарии:

1. только имя поля в классе выдает ошибку без типа данных

2. @SpringUser Вы должны удалить тип данных из Json, а не из класса Java. Я отредактировал ответ

3. Нет проблем, единственное, что важно, — это то, что вы понимаете ошибку.

4. этот json — мой ожидаемый результат, которого я не хочу, но моя ошибка все еще существует

5. Вы уверены, что передаете Джексону правильный json? Я попробовал, и ваш код работает для меня с правильным json.