[英]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.