com.fasterxml.jackson.databind.exc.MismatchedInputException

#java

#java

Вопрос:

Невозможно создать класс java для соответствующей строки Json, поскольку это слишком большой файл json, и он будет динамически меняться.Я был бы рад, если кто-нибудь сможет опубликовать решение. Нужна помощь…. Ниже приведен пример кода:..

 public class rough {
    public static void main(String[] args) throws IOException {
        String jsondata="{"data":[{"MsgType":"BTO","EventType":"901","Role":"Sender","Version":"2.3"}, {"MsgType":"BTO","EventType":"901","Role":"Sender","Version":"2.4"},{"MsgType":"BTO","EventType":"901","Role":"Sender","Version":"2.5"},{"MsgType":"BTO","EventType":"901","Role":"Sender","Version":"2.6"},{"MsgType":"BTO","EventType":"901","Role":"Sender","Version":"2.7"}]}";
        ObjectMapper objectMapper=new ObjectMapper();
        ValidationProfile profile=objectMapper.readValue(jsondata,ValidationProfile.class);
        System.out.println("profile:" profile.toString());
    }

    public class ValidationProfile {
        public List<String> data;
    }
}
  

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

1. можете ли вы объяснить, что вы имели в виду Can not create a java class for the respective Json string ?

2. Поскольку текст JSON является динамическим, а не статическим, используйте readValue() для синтаксического анализа в Map<String, Object> , или используйте readTree() вместо readValue() .

3. в качестве poc я добавил пример кода с небольшой строкой json, на самом деле Json будет в файле, и он слишком большой. Поэтому невозможно создать класс как данные и добавить переменные в виде общедоступной строки MsgType …. и так далее.

4. Андреас — Спасибо за ваш ответ. если я использую Map<String, Object>, json будет в формате как данные в качестве ключа, а полный json будет как значение. Нужно это в виде списка<Строка>

Ответ №1:

Вы пытаетесь десериализовать объект JSON в виде строки JSON. Вы не можете этого сделать.

В качестве простого исправления (но оно не идеально) изменение вашего ValidationProfile класса на:

 public static class ValidationProfile {
  public List<Map<String, String>> data;
}
  

Лучшим подходом является введение соответствующих классов для всей структуры JSON:

 
public static class ValidationProfile {
  private List<Event> data;

  // getters
}


public static class Event {
        
  @JsonProperty("MsgType")
  private String msgType;
  @JsonProperty("EventType")
  private String eventType;
  @JsonProperty("Role")
  private String role;
  @JsonProperty("Version")
  private String version;

  // getters
        
}
  

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

1. Не удается создать класс, поскольку Json изменяется динамически … и нужен в виде списка<Строка>

2. @Shubho Использование List<Map<String, String>>

3. или в более общем смысле List<Map<String, Object>>

4. Строка Json не будет поддерживать ни одну из вышеуказанных коллекций

Ответ №2:

Удаление «данных» из строки Json в начале. сработало для меня.

Профиль JsonNode=ObjectMapper.readTree(jsondata);