[英]Serliazing Java HashMap to JSON using Jackson ObjectMapper
我正在开发一个 Spring 引导 MVC 应用程序,该应用程序在前端使用 Thymeleaf 模板。
我正在尝试将我的 MVC model 中的 HashMap 绑定到我的 Z3908B6268ACF837 之一中的 JavaScript 模板变量。 这是迄今为止所做的: -
在我的 MVC controller class 中,我创建了一个 HashMap 代表按类别组织的用户技能。 技能 class 是一个数据 object 包含名称和 id 属性:-
Map<String, List<Skill>> skillsMap = new HashMap();
我用所有类别和技能信息填充了这个 map,然后将其添加到我的 Model:-
model.addAttribute("skillsMap", skillsMap);
在脚本部分的 Thymeleaf 模板上,我试图将此 HashMap 绑定到变量。 作为第二步,我尝试从 map 中检索其中一个列表并分配给第二个变量:-
var skillsMapMap = [[${skillsMap}]];
var adminList = skillsMapMap.get('Admin');
当我调试它时,我可以看到正在读取 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
Having researched this, I realized that this error was caused because Java does not by default serialize the map in valid JSON format and so the attempted bind to a JavaScript variable failed. So, instead of just adding the HashMap straight to the Model as in step 2, I added some code to use Jackson to convert it into a JSON String first: -
//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 变量时,当我在浏览器中调试时,object 看起来像这样:-
var skillsMapJson = {"Languages_OD":[{"id":66,"name":"SQL"},{"id":67,"name":"PL/SQL"}], etc, etc};
JSON 现在看起来有效,但是所有引号都被转义了,它现在抛出了一个不同的异常:-
```Uncaught SyntaxError: Unexpected token &```
我觉得如果 JSON 字符串包含实际引号而不是“ Map 将成功绑定到我的变量。我将不胜感激有关如何处理此问题的任何建议。非常感谢您的阅读。
编辑:下面添加的错误截图:-
我最终确实解决了这个问题,因此我提供了一个解决方案,以防它对其他人有所帮助。 但是,我觉得该解决方案有点“hacky”,因此欢迎任何进一步的答案来改进此问题或提供更优雅的解决方案。
问题在于我试图从 Model 检索我的 map 并分配给 JavaScript 变量的方式。 最初,我正在尝试这个: -
var skillsMapRawString = [[${skillsMapJson}]];
问题在于,这种引用技能MapJson 的方式强制 JavaScript 将其视为 Object 并且在尝试将其反序列化为 Z0ECD11C1AD7A287401D8ZD14 时,它无法处理原始帖子中描述的编码问题。 因此,上面的行抛出了异常“unexpected token &”。
通过在 object 引用周围添加单引号,JavaScript 被迫将技能MapJson 视为字符串而不是 object:-
var skillsMapRawString = '[[${skillsMapJson}]]';
上面的变量赋值现在可以成功运行,但我们仍然遇到它包含编码引号的问题,这会阻止它被解析为 JSON Object。 这是感觉有点像黑客的地方,因为我通过对字符串进行全局替换来解决这个问题:-
var skillsMapJSONString = skillsMapRawString.replace(/"/g, "\"");
替换了之前导致问题的编码部分后,现在可以将字符串解析为 JSON:-
var skillsMapParsed = JSON.parse(skillsMapJSONString);
最后,我将列表的 map 成功分配给 JavaScript 变量::)
符号"""
和类似的是 HTML 转义。 所以你的信息是 HTML 转义。 您可以使用库apache.commons/commons 中的class org.apache.commons.text.StringEscapeUtils
将其取消转义在以下位置找到的信息: 如何在 Java 中取消转义 HTML 字符实体?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.