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.mzph.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再点…