Смешение Java HashMap в JSON с использованием Jackson ObjectMapper - PullRequest
0 голосов
/ 05 ноября 2019

Я занимаюсь разработкой приложения Spring Boot MVC, которое использует шаблоны Thymeleaf во внешнем интерфейсе.

Я пытаюсь связать HashMap из моей модели MVC с переменной JavaScript в одном из моих шаблонов Thymeleaf. Это то, что было сделано до сих пор: -

  1. В своем классе контроллеров MVC я создал HashMap, который представляет навыки пользователя, организованные по категориям. Класс Skill - это объект данных, содержащий свойства name и id: -

    Map<String, List<Skill>> skillsMap = new HashMap();

  2. Я заполнил эту карту всей информацией о категориях и навыках, а затем добавил еек моей модели: -

    model.addAttribute("skillsMap", skillsMap);

  3. В моем шаблоне Thymeleaf в разделе скрипта я пытаюсь привязать этот HashMap к переменной. На втором этапе я пытаюсь извлечь один из списков с карты и назначить вторую переменную: -

    var skillsMapMap = [[${skillsMap}]];

    var adminList = skillsMapMap.get('Admin');

  4. Когда я отлаживал это, я мог видеть, что HashMap читается и делается попытка связать его с моей переменной JavaScript: -

    var skillsMapMap = {Languages=[Python, SQL, PL/SQL, Java], Databases=[MySQL, Oracle, Mongo], Editors=[Word, TextPad, Notepad]};

Это выглядело хорошо на первый взгляд, и я мог видеть, что он содержит все мои данные, но выдает следующую ошибку: -

Uncaught Syntax Error: invalid shorthand property initializer

Исследовав это, я понял, что эта ошибка была вызвана тем, что Java по умолчанию не сериализует карту в допустимом формате JSON, и поэтому попытка привязки к переменной JavaScript не удалась. Итак, вместо того, чтобы просто добавить HashMap прямо в модель, как на шаге 2, я добавил некоторый код, чтобы сначала использовать Джексон для преобразования его в строку JSON: -


//Populate the map with all required data then....

String objectMapper = null;
try {
    objectMapper = new ObjectMapper().writeValueAsString(skillsMap);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}
model.addAttribute("skillsMap", objectMapper);```

Этовремя Когда я пытаюсь связать это с моей переменной JavaScript, объект выглядит так, когда я отлаживаю в своем браузере: -

var skillsMapJson = {&quot;Languages_OD&quot;:[{&quot;id&quot;:66,&quot;name&quot;:&quot;SQL&quot;},{&quot;id&quot;:67,&quot;name&quot;:&quot;PL/SQL&quot;}], etc, etc};

Теперь JSON выглядитдопустимо, но все кавычки экранированы, и теперь выдается другое исключение: -

```Uncaught SyntaxError: Unexpected token &```

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

РЕДАКТИРОВАТЬ: скриншот ошибки добавлен ниже: -

JSON encoding issue in JavaScript variable

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Символы "&quot;" и т. П. Являются HTML-кодами. Таким образом, ваша информация в HTML-коде. Вы можете удалить его обратно, используя класс org.apache.commons.text.StringEscapeUtils из библиотеки apache.commons / commons-text . Информация найдена по адресу: Как убрать символьные сущности HTML в Java?

0 голосов
/ 07 ноября 2019

Я в конце концов обошел эту проблему и поэтому предлагаю решение на случай, если оно кому-нибудь поможет. Тем не менее, я чувствую, что решение немного «хакерское», и поэтому приветствую любые дальнейшие ответы, которые улучшат это или предложат более элегантное решение.

Проблема заключалась в том, как я пытался получить свою картуиз модели и назначить переменную JavaScript. Первоначально я пытался это сделать: -

var skillsMapRawString = [[${skillsMapJson}]];

Проблема в том, что этот способ ссылки на skillMapJson заставляет JavaScript обрабатывать его как объект, и он не может справиться с проблемой кодирования, описанной в исходном посте, при попыткедесериализовать его в JSON. Поэтому в приведенной выше строке выдается исключение «неожиданный токен &».

Добавляя одинарные кавычки вокруг ссылки на объект, JavaScript вынужден обрабатывать skillMapJson как строку, а не объект: -

var skillsMapRawString = '[[${skillsMapJson}]]';

Вышеприведенное присвоение переменной теперь успешно работает, но у нас все еще есть проблема, заключающаяся в том, что он содержит закодированные кавычки, которые предотвращают его анализ в объекте JSON. Вот где это выглядит как хак, потому что я обошел это, выполнив глобальную замену строки: -

var skillsMapJSONString = skillsMapRawString.replace(/&quot;/g, "\"");

Заменив закодированные разделы, которые раньше вызывали проблемы, строка можетТеперь проанализируем как JSON: -

var skillsMapParsed = JSON.parse(skillsMapJSONString);

И наконец, моя карта списков успешно присвоена переменной JavaScript! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...