Исключение нераспознанного поля из-за неправильно отформатированного O/P objectMapper.writeValueAsString

Я пытаюсь десериализовать свой хэш-карту (JSON) в класс POJO, используя Jackson - ObjectMapper . Ниже приведена хэш-карта:

List<Object> setJSONValues = new ArrayList<Object>(Arrays.asList(requestObj));
List<String> setJSONKeys = apiUtility.readJSONKeys(new  File("ABC.csv"));
HashMap<String, Object> requestMap = new HashMap<String, Object>();
 if (setJSONKeys.size() == setJSONValues.size()) {
     for (int i = 0; i < setJSONKeys.size(); i++) {
                requestMap.put(setJSONKeys.get(i), setJSONValues.get(i));
     }
 }

Я хочу использовать этот requestMap в своем классе POJO с помощью средства сопоставления объектов, см. ниже:

objectMapper.readValue(objectMapper.writeValueAsString(requestMap), MyRequestDTO.class);

Я получаю следующую ошибку: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле «apptDateTime» (класс Collector.MyRequestDTO)

Вышеупомянутая ошибка возникает, потому что O/P моего objectMapper.writeValueAsString(requestMap): {" \"apptDateTime\"":"\"2019-03-19 10:00:00\"","\"meter\"": "\"8682\""

Добавление Hashmap O/P:

for (String s:requestMap.keySet())
  System.out.println("Key is "+s+"Value is "+requestMap.get(s));

Вывод: Ключ — «apptDateTime». Значение — «2019-03-19 10:00:00». Ключ — «meter». Значение — «8682».


person Mandy    schedule 08.04.2020    source источник
comment
Обратите внимание, что mapper отлично работает, если строка json имеет следующий формат: String content = { \carType\ : \Mercedes\};   -  person Mandy    schedule 08.04.2020
comment
что содержится в setJSONKeys? Можете ли вы показать код для apiUtility.readJSONKeys ? Похоже, он не возвращает ключи должным образом.   -  person Joni    schedule 08.04.2020
comment
hashmap работает правильно, см. ниже: for (String s:requestMap.keySet()){ System.out.println(Key is +s+Value is +requestMap.get(s)); } Вывод: ключ apptDateTimeValue — 2019-03-19 10:00:00 Ключ —meterValue — 8682.   -  person Mandy    schedule 08.04.2020
comment
и что это показывает вам для значения ключа?   -  person Joni    schedule 08.04.2020
comment
Обновленный ответ   -  person Mandy    schedule 08.04.2020


Ответы (1)


Ваш служебный метод для чтения keys работает не так, как вы ожидаете (этот :)

List<String> setJSONKeys = apiUtility.readJSONKeys(new  File("ABC.csv"));

Он возвращает ключи и значения, заключенные в двойные кавычки, поэтому ключ, который должен быть "apptDateTime", на самом деле возвращается как " \"apptDateTime\"". Вы можете увидеть это в добавленном вами выводе отладки: вы не добавляете кавычки вокруг ключей или значений, но вывод все равно показывает кавычки.

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

    String key = removeQuotes(setJSONKeys.get(i));
    String value = removeQuotes(setJSONValues.get(i))
    requestMap.put(key, setJSONValues.get(i));

...

String removeQuotes(String key) {
    key = key.trim();
    key = key.substring(1, key.length() - 1); // remove quotes
    return key.trim();
}
person Joni    schedule 08.04.2020
comment
Понятно!! Спасибо - person Mandy; 09.04.2020