使用Jackson ObjectMapper将Java HashMap序列化为JSON

我正在开发一个在前端使用Thymeleaf模板的Spring Boot MVC应用程序。

我正在尝试将MVC模型中的HashMap绑定到我的Thymeleaf模板之一中的JavaScript变量。到目前为止,这已完成:-

  1. 在我的MVC控制器类中,我创建了一个HashMap,它表示按类别组织的用户技能。 Skill类是一个包含名称和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
  1. 对此进行了研究,我意识到此错误是由于Java默认情况下不以有效JSON格式序列化地图而导致尝试绑定到JavaScript变量失败。因此,与其像第2步那样直接将HashMap直接添加到Model中,我还添加了一些代码以使用Jackson首先将其转换为JSON String:-

    
    //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变量时,在浏览器中调试时,对象看起来像这样:-

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将成功绑定到我的变量。我将对如何处理此问题提供任何建议。非常感谢您阅读。

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

使用Jackson ObjectMapper将Java HashMap序列化为JSON

xiaoyan198607 回答:使用Jackson ObjectMapper将Java HashMap序列化为JSON

我最终确实解决了这个问题,因此提供了一个解决方案,以防它对其他人有帮助。但是,我认为该解决方案有点“棘手”,因此欢迎对此有进一步改善或提供更优雅解决方案的进一步答案。

问题出在我试图从Model检索地图并将其分配给JavaScript变量的方式上。最初,我正在尝试:-

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

问题在于,这种引用skillMapJson的方式迫使JavaScript将其视为对象,并且在尝试将其反序列化为JSON时无法处理原始文章中描述的编码问题。因此,以上行引发了异常“意外令牌&”。

通过在对象引用周围添加单引号,JavaScript被强制将SkillsMapJson视为字符串而非对象:-

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

上面的变量分配现在可以成功工作,但是仍然存在问题,因为它包含编码的引号,阻止了将其解析为JSON对象。在这里感觉有点像hack,因为我通过对String进行全局替换来解决此问题:-

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

已经替换了之前引起问题的编码部分,现在可以将String解析为JSON:-

var skillsMapParsed = JSON.parse(skillsMapJSONString);

最后,我将列表成功分配给一个JavaScript变量! :)

,

符号"&quot;"和类似的符号是HTML转义符。因此,您的信息是HTML转义的。您可以使用库apache.commons/commons-text中的类org.apache.commons.text.StringEscapeUtils来取消转义。在以下位置找到的信息:How to unescape HTML character entities in Java?

本文链接:https://www.f2er.com/3158376.html

大家都在问