JSON工具-JSONUtil

對象轉JSON

JSONUtil.toJsonStr可以將任意對象(Bean、Map、集合等)直接轉換為JSON字符串。 如果對象是有序的Map等對象,則轉換后的JSON字符串也是有序的。

  //region 處理POST請求,將TreeMap轉換為JSON字符串返回/*** 處理POST請求,將TreeMap轉換為JSON字符串返回* 路徑:/jsonToStr** @return 返回排序后的Map轉換成的JSON字符串*/@PostMapping("/jsonToStr")  // 定義POST請求映射路徑public String jsonToStr() {// 創建一個TreeMap,它會自動按照key的自然順序排序TreeMap<Object, Object> sortedMap = new TreeMap<>();// 向Map中添加鍵值對// 添加key為"attributes",value為"a"的條目sortedMap.put("attributes", "a");// 添加key為"b",value為"b"的條目sortedMap.put("b", "b");// 添加key為"c",value為"c"的條目sortedMap.put("c", "c");System.out.println("JSONUtil.toJsonStr(sortedMap) = " + JSONUtil.toJsonStr(sortedMap));System.out.println("JSONUtil.toJsonPrettyStr(sortedMap) = " + JSONUtil.toJsonPrettyStr(sortedMap));// 使用JSONUtil工具類將Map轉換為JSON格式的字符串并返回return JSONUtil.toJsonStr(sortedMap);}//endregion

運行結果:?

  //region 處理POST請求,將Map按照插入順序轉換為JSON字符串返回/*** 處理POST請求,將Map按照插入順序轉換為JSON字符串返回* 路徑:/jsonToStr** @return 返回按照插入順序排列的Map轉換成的JSON字符串*/@PostMapping("/jsonToStrOrder")  // 定義POST請求映射路徑public String jsonToStrOrder() throws JsonProcessingException {// 使用LinkedHashMap,它會按照put的順序存儲鍵值對Map<Object, Object> orderedMap = new LinkedHashMap<>();// 向Map中添加鍵值對(順序會被保留)// 第1個插入orderedMap.put("attributes", "a");// 第2個插入orderedMap.put("b", "b");// 第3個插入orderedMap.put("c", "c");// 遍歷輸出,確認順序orderedMap.forEach((k, v) -> System.out.println(k + " -> " + v));ObjectMapper objectMapper = new ObjectMapper();// 禁用排序objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false);return objectMapper.writeValueAsString(orderedMap);}//endregion

?運行結果:

JSON字符串解析

  //region 處理POST請求,返回一個固定的JSON對象并演示JSON解析操作/*** 處理POST請求,返回一個固定的JSON對象并演示JSON解析操作* @return 返回一個預定義的JSON對象*/@PostMapping("/jsonObject")public JSONObject jsonObject() {// 定義一個多行JSON字符串(使用轉義字符保持格式)String json = "{\n" +"  \"id\" : \"a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8\",\n" +"  \"name\" : \"User_4821\",\n" +"  \"age\" : 32,\n" +"  \"isActive\" : true,\n" +"  \"scores\" : [ 87, 45, 63 ],\n" +"  \"address\" : {\n" +"    \"street\" : \"Street 42\",\n" +"    \"city\" : \"Tokyo\",\n" +"    \"zipCode\" : 54321\n" +"  }\n" +"}";// 使用Hutool的JSONUtil將字符串解析為JSONObjectJSONObject jsonObject = JSONUtil.parseObj(json);// 演示不同取值方法:// 1. get() 方法返回Object類型,需要手動轉型// 返回Object類型(實際是String)Object id = jsonObject.get("id");// 直接打印ObjectSystem.out.println("id = " + id);// 2. getStr() 方法直接返回String類型(自動轉換,避免轉型)// 直接返回StringString name = jsonObject.getStr("name");System.out.println("name = " + name);// 3. 獲取數值類型(使用getBigDecimal處理整數/小數)// 適合所有數值類型BigDecimal age = jsonObject.getBigDecimal("age");System.out.println("age = " + age);// 返回完整的JSON對象return jsonObject;}//endregion

運行結果:

?

  //region 獲取用戶列表API/*** 獲取用戶列表API* 路徑:/getUserList** @param requestBody 請求體(可以是單個User對象或User列表)* @return 返回User對象列表** 優化說明:* 1. 支持靈活接收單個對象或集合* 2. 使用泛型方法處理不同類型輸入* 3. 增強類型安全和異常處理* 4. 規范日志記錄*/@PostMapping("/getUserList")public ResponseEntity<List<User>> getUserList(@RequestBody Object requestBody) {try {// 1. 將輸入統一轉換為JSON格式處理String jsonStr = JSONUtil.toJsonStr(requestBody);// 2. 智能判斷輸入類型(單個對象或數組)List<User> users;if (jsonStr.startsWith("[")) {// 數組情況:直接轉換為List<User>users = JSONUtil.toList(JSONUtil.parseArray(jsonStr), User.class);} else {// 單個對象情況:轉換為User后包裝為ListUser user = JSONUtil.toBean(jsonStr, User.class);users = Collections.singletonList(user);}System.out.println("users = " + JSONUtil.toJsonStr(users));// 3. 返回統一格式的成功響應return ResponseEntity.ok(users);} catch (Exception e) {return ResponseEntity.badRequest().body(Collections.emptyList());}}//endregionclass User {private String id;private String name;private int age;private boolean isActive;private List<Integer> scores;private Address address;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isActive() {return isActive;}public void setActive(boolean active) {isActive = active;}public List<Integer> getScores() {return scores;}public void setScores(List<Integer> scores) {this.scores = scores;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}}class Address {private String street;private String city;private int zipCode;public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public int getZipCode() {return zipCode;}public void setZipCode(int zipCode) {this.zipCode = zipCode;}}

運行結果:

curl --request POST \--url http://localhost:8080/demo/getUserList \--header 'Accept: */*' \--header 'Accept-Encoding: gzip, deflate, br' \--header 'Connection: keep-alive' \--header 'Content-Type: application/json' \--header 'User-Agent: PostmanRuntime-ApipostRuntime/1.1.0' \--data '{"id": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8","name": "User_4821","age": 32,"isActive": true,"scores": [87,45,63],"address": {"street": "Street 42","city": "Tokyo","zipCode": 54321}
}'

XML字符串轉換為JSON

  //region 將XML數據轉換為JSON格式的API端點/*** 將XML數據轉換為JSON格式的API端點* 路徑:/xmlToJson** @param xml 客戶端提交的XML格式字符串* @return 包含解析結果的ResponseEntity,成功時返回name和city字段,失敗時返回錯誤信息* 功能說明:* 1. 將輸入的XML字符串轉換為JSON格式* 2. 從XML結構中提取user節點的name和address下的city字段* 3. 提供完善的錯誤處理和日志記錄*/@PostMapping("/xmlToJson")public ResponseEntity<?> xmlToJson(@RequestBody String xml) {try {// 1. 將XML字符串轉換為JSONObject對象// 使用Hutool工具的JSONUtil進行轉換,自動處理XML標簽、屬性和嵌套結構JSONObject jsonObject = JSONUtil.parseFromXml(xml);// 2. 安全獲取root節點// XML轉換后的JSON對象最外層是root節點,需要先獲取這個節點// 如果root節點不存在,說明XML格式不符合預期JSONObject root = jsonObject.getJSONObject("root");if (root == null) {// 返回400錯誤,提示缺少root節點return ResponseEntity.badRequest().body(Collections.singletonMap("error", "XML格式錯誤:缺少root節點"));}// 3. 安全獲取user節點// 從root節點下獲取user節點,這是業務數據的主要容器// 如果user節點不存在,說明XML缺少關鍵數據結構JSONObject user = root.getJSONObject("user");if (user == null) {// 返回400錯誤,提示缺少user節點return ResponseEntity.badRequest().body(Collections.singletonMap("error", "XML格式錯誤:缺少user節點"));}// 4. 獲取關鍵字段:name和address.city// 4.1 直接獲取user節點下的name字段String name = user.getStr("name");// 4.2 安全獲取address節點及其city字段// 先獲取address節點對象,可能為null(如果address節點不存在)JSONObject address = user.getJSONObject("address");// 使用三元表達式安全獲取city字段,如果address不存在則city為nullString city = (address != null) ? address.getStr("city") : null;// 5. 構建返回結果Map// 使用HashMap存儲返回字段,保證字段順序(如果需要有序可使用LinkedHashMap)Map<String, Object> result = new HashMap<>();// 必填字段:nameresult.put("name", name);// 處理可能為空的city字段if (city != null) {// 如果city存在,直接放入結果result.put("city", city);} else {// 如果city不存在,添加警告信息result.put("city_warning", "address或city節點不存在");}// 6. 記錄解析日志// 在實際項目中建議使用日志框架(如SLF4J)替代System.outSystem.out.println("解析結果 - name: " + name + ", city: " + city);// 7. 返回成功響應(HTTP 200)// 使用ResponseEntity封裝返回結果和狀態碼return ResponseEntity.ok(result);} catch (Exception e) {// 全局異常處理// 捕獲所有可能的異常(XML解析異常、JSON處理異常等)// 記錄錯誤日志(實際項目應使用log.error())System.err.println("XML解析異常: " + e.getMessage());// 返回400錯誤和異常信息// 注意:生產環境可能需要過濾敏感異常信息return ResponseEntity.badRequest().body(Collections.singletonMap("error", "XML解析失敗: " + e.getMessage()));}}//endregion

運行結果:

curl --request POST \--url http://localhost:8080/demo/xmlToJson \--header 'Accept: */*' \--header 'Accept-Encoding: gzip, deflate, br' \--header 'Connection: keep-alive' \--header 'User-Agent: PostmanRuntime-ApipostRuntime/1.1.0' \--data '<?xml version="1.0" encoding="UTF-8"?>
<root><user id="1001"><name>張三</name><age>28</age><gender>男</gender><address><street>科技路123號</street><city>北京</city><zipcode>100000</zipcode></address><hobbies><hobby>游泳</hobby><hobby>編程</hobby><hobby>閱讀</hobby></hobbies></user><product><id>P1001</id><name>智能手機</name><price>3999.00</price><specs><color>黑色</color><memory>128GB</memory></specs></product><order><orderNo>ORD20230001</orderNo><date>2023-05-15</date><items><item><productId>P1001</productId><quantity>2</quantity></item></items></order>
</root>'

JSON轉換為XML

  //region JSON轉XML的API端點/*** JSON轉XML的API端點* 路徑:/jsonToXml** @param json 客戶端提交的JSON格式字符串* @return 轉換后的XML字符串(成功)或錯誤信息(失敗)*/@PostMapping("/jsonToXml")public ResponseEntity<String> jsonToXml(@RequestBody String json) {// 參數校驗if (!StringUtils.hasText(json)) {return ResponseEntity.badRequest().body("錯誤:輸入JSON不能為空");}try {// 解析JSON并轉換為XMLJSONObject jsonObject = JSONUtil.parseObj(json);String xmlStr = JSONUtil.toXmlStr(jsonObject);// 驗證轉換結果if (!StringUtils.hasText(xmlStr)) {return ResponseEntity.badRequest().body("錯誤:XML轉換失敗");}// 返回成功響應return ResponseEntity.ok().header("Content-Type", "application/xml").body(xmlStr);} catch (Exception e) {// 異常處理return ResponseEntity.badRequest().body("轉換失敗: " + e.getMessage());}}//endregion

運行結果:

curl --request POST \--url http://localhost:8080/demo/jsonToXml \--header 'Accept: */*' \--header 'Accept-Encoding: gzip, deflate, br' \--header 'Connection: keep-alive' \--header 'Content-Type: application/json' \--header 'User-Agent: PostmanRuntime-ApipostRuntime/1.1.0' \--data '{"id" : "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8","name" : "User_4821","age" : 32,"isActive" : true,"scores" : [ 87, 45, 63 ],"address" : {"street" : "Street 42","city" : "Tokyo","zipCode" : 54321}
}'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

死鎖 手撕死鎖檢測工具

目錄 引言 一.理論聯立 1.死鎖的概念和原因 2.死鎖檢測的基本思路 3.有向圖在死鎖檢測中的應用 二.代碼實現案例&#xff08;我們會介紹部分重要接口解釋&#xff09; 1.我們定義一個線性表來存線程ID和鎖ID 2.表中數據的查詢接口 3.表中數據的刪除接口 4.表中數據的添…

Java 中 SQL 注入問題剖析?

一、引言? 在當今數字化時代&#xff0c;數據是企業和組織的核心資產之一。許多應用程序都依賴于數據庫來存儲和管理數據&#xff0c;而 Java 作為一種廣泛使用的編程語言&#xff0c;常被用于開發與數據庫交互的應用程序。然而&#xff0c;SQL 注入這一安全漏洞卻如同隱藏在…

安全理念和安全產品發展史

從安全理念的發展歷史來看,技術與產品的演進始終圍繞 “威脅對抗” 與 “業務適配” 兩大核心展開。以下從七個關鍵階段解析安全技術與產品的發展脈絡,并結合最新實踐與未來趨勢提供深度洞察: 一、密碼學奠基階段(1970s 前) 安全理念:以 “信息保密” 為核心,防御手段…

【Ansible自動化運維】二、Playbook 深入探究:構建復雜自動化流程

? 在 Ansible 自動化運維體系中&#xff0c;Playbook 是極為關鍵的部分。它允許我們以一種結構化、可重復的方式定義和執行一系列復雜的任務&#xff0c;從而構建高效的自動化流程。本篇文章將深入探究 Ansible Playbook 的各個方面&#xff0c;助您掌握構建復雜自動化…

springboot項目中常用的工具類和api

在Spring Boot項目中&#xff0c;開發者通常會依賴一些工具類和API來簡化開發、提高效率。以下是一些常用的工具類及其典型應用場景&#xff0c;涵蓋 Spring 原生工具、第三方庫&#xff08;如Hutool、Guava&#xff09; 和 Java 自帶工具。 1. Spring Framework 自帶工具類 (…

23種設計模式-行為型模式-模板方法

文章目錄 簡介場景解決代碼關鍵優化點 總結 簡介 模板方法是一種行為設計模式&#xff0c;它在超類中定義了一個算法的框架&#xff0c;允許子類在不修改結構的情況下重寫算法的特定步驟。 場景 假如你正在開發一款分析文檔的數據挖掘程序。用戶需要向程序輸入各種格式&…

解決Long類型前端精度丟失和正常傳回后端問題

在 Java 后端開發中&#xff0c;可能會遇到前后端交互過程中 Long 類型精度丟失的問題。尤其是在 JavaScript 中&#xff0c;由于其 Number 類型是雙精度浮點數&#xff0c;超過 16 位的 Long 類型值就會發生精度丟失。 問題背景 假設有如下實體類&#xff1a; public class…

PowerPhotos:拯救你的Mac照片庫,告別蘋果原生應用的局限

如果你用Mac管理照片&#xff0c;大概率被蘋果原生「照片」應用折磨過——無法真正并行操作多個圖庫。每次切換圖庫都要關閉重啟&#xff0c;想合并照片得手動導出導入&#xff0c;重復文件更是無處可逃…… 直到我發現了 PowerPhotos&#xff0c;這款專為Mac設計的照片庫管理…

android 14.0 工廠模式 測試音頻的一些問題(高通)

1之前用tinycap&#xff0c;現在得用agmcap 執行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 報錯1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…

以庫存系統為核心的ERP底層架構設計

在企業資源計劃&#xff08;ERP&#xff09;系統中&#xff0c;庫存系統常被視為基礎模塊。但在現代企業的數字化進程中&#xff0c;庫存系統不僅僅是一個模塊&#xff0c;它已經逐步演化為驅動整個ERP生態的核心引擎。本文從架構設計的角度&#xff0c;探討為何庫存系統應被置…

辛格迪客戶案例 | 北京舒曼德醫藥實施電子合約系統(eSign)

01 北京舒曼德醫藥科技開發有限公司&#xff1a;醫藥科技的數字化先鋒 北京舒曼德醫藥科技開發有限公司&#xff08;以下簡稱“舒曼德醫藥”&#xff09;作為國內醫藥科技領域的領軍企業&#xff0c;致力于創新藥物的研發、臨床試驗和市場推廣。公司以“科技興藥、質量為先、服…

【UE5】RTS游戲的框選功能+行軍線效果實現

目錄 效果 步驟 一、項目準備 二、框選NPC并移動到指定地點 三、框選效果 效果 步驟 一、項目準備 1. 新建一個俯視角游戲工程 2. 新建一個pawn、玩家控制器和游戲模式,這里分別命名為“MyPawn”、“MyController”和“MyGameMode” 3. 打開“MyGameMode”,設置玩家…

vim定位有問題的腳本/插件的一般方法

在使用vim的過程中可能會遇到一些報錯或其他不符合預期的情況&#xff0c;本文介紹一些我自己常用的定位有問題腳本/插件的方法&#xff08;以下方法同樣適用于neovim&#xff09; 執行了某些命令的情況 這種情況最簡單&#xff0c;使用:h 命令&#xff0c;如果插件有文檔的話…

智能驅動教育變革:人工智能在高中教育中的實踐路徑與創新策略

一、引言 隨著信息技術的飛速發展&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;已成為推動社會進步的重要力量。在教育領域&#xff0c;人工智能的應用正逐漸改變著傳統的教學模式和方法&#xff0c;為教育現代化注入了新的活力。高中教育作為教育…

VLAN(虛擬局域網)

一、vlan概述 VLAN(virtual local area network)是一種通過邏輯方式劃分網絡的技術&#xff0c;允許將一個物理網絡劃分為多個獨立的虛擬網絡。每一個vlan是一個廣播域&#xff0c;不同vlan之間的通信需要通過路由器或三層交換機 [!注意] vlan是交換機獨有的技術&#xff0c;P…

spring-cloud-starter-alibaba-seata使用說明

Spring Cloud Alibaba Seata 使用說明 spring-cloud-starter-alibaba-seata 是 Spring Cloud Alibaba 生態中用于集成分布式事務框架 Seata 的核心組件&#xff0c;支持 AT&#xff08;自動補償&#xff09;、TCC&#xff08;手動補償&#xff09; 等模式。 一、依賴配置 添加…

每日一題(小白)暴力娛樂篇23

由題意得知給我們一串數字&#xff0c;我們每次交換兩位&#xff0c;最少交換多少次成功得到有順序的數組。我們以平常的思維去思考&#xff0c;加入給你一串數字獲得最少的交換次數&#xff0c;意味著你的交換后續基本不會變&#xff0c;比如說2 1 3 5 4 中1與2交換后不變&…

Python基礎——Pandas庫

對象的創建 導入 Pandas 時&#xff0c;通常給其一個別名“pd”&#xff0c;即 import pandas as pd。作為標簽庫&#xff0c;Pandas 對象在 NumPy 數組基礎上給予其行列標簽。可以說&#xff0c;列表之于字典&#xff0c;就如 NumPy 之于 Pandas。Pandas 中&#xff0c;所有數…

Spring入門概念 以及入門案例

Spring入門案例 Springspring是什么spring的狹義與廣義spring的兩個核心模塊IoCAOP Spring framework特點spring入門案例不用new方法&#xff0c;如何使用返回創建的對象 容器&#xff1a;IoC控制反轉依賴注入 Spring spring是什么 spring是一款主流的Java EE輕量級開源框架 …

The packaging for this project did not assign a file to the build artifact

問題&#xff1a; maven install報錯&#xff1a;The packaging for this project did not assign a file to the build artifact 解決方案&#xff1a; 方案1&#xff1a; 使用mvn clean install 就可以解決問題&#xff0c; 方案2&#xff1a; 找到lifecycle點clean再點…