繁体   English   中英

使用 Z7930C951E609E4161E82EDZ26004 将 Java HashMap 序列化到 JSON

[英]Serliazing Java HashMap to JSON using Jackson ObjectMapper

我正在开发一个 Spring 引导 MVC 应用程序,该应用程序在前端使用 Thymeleaf 模板。

我正在尝试将我的 MVC model 中的 HashMap 绑定到我的 Z3908B6268ACF837 之一中的 JavaScript 模板变量。 这是迄今为止所做的: -

  1. 在我的 MVC controller class 中,我创建了一个 HashMap 代表按类别组织的用户技能。 技能 class 是一个数据 object 包含名称和 id 属性:-

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

  2. 我用所有类别和技能信息填充了这个 map,然后将其添加到我的 Model:-

    model.addAttribute("skillsMap", skillsMap);

  3. 在脚本部分的 Thymeleaf 模板上,我试图将此 HashMap 绑定到变量。 作为第二步,我尝试从 map 中检索其中一个列表并分配给第二个变量:-

    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
  1. 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);```
  2. 这次当我尝试将它绑定到我的 JavaScript 变量时,当我在浏览器中调试时,object 看起来像这样:-

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 字符串包含实际引号而不是“ Map 将成功绑定到我的变量。我将不胜感激有关如何处理此问题的任何建议。非常感谢您的阅读。

编辑:下面添加的错误截图:-

JavaScript 变量中的 JSON 编码问题

我最终确实解决了这个问题,因此我提供了一个解决方案,以防它对其他人有所帮助。 但是,我觉得该解决方案有点“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(/&quot;/g, "\"");

替换了之前导致问题的编码部分后,现在可以将字符串解析为 JSON:-

var skillsMapParsed = JSON.parse(skillsMapJSONString);

最后,我将列表的 map 成功分配给 JavaScript 变量::)

符号"&quot;" 和类似的是 HTML 转义。 所以你的信息是 HTML 转义。 您可以使用库apache.commons/commons 中的class org.apache.commons.text.StringEscapeUtils将其取消转义在以下位置找到的信息: 如何在 Java 中取消转义 HTML 字符实体?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM