簡體   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