Java接收xml格式参数转为json

devtools/2024/11/15 2:08:12/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

1、定义实体类

java">import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "User")
@Setter
@ToString
public class User {private String name;@XmlElement(name = "username")public String getName() {return name;}}

注意这里需要把@XmlElement注解用在get方法上,实际使用时发现如果直接作用在字段上会报错。

2、使用jaxb对接 转为实体类

java">import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;public User fromXml(String xmlData) throws Exception {JAXBContext jaxbContext = JAXBContext.newInstance(User.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();return (User) unmarshaller.unmarshal(new StringReader(xmlData));
}

这里的xmlData示例:<User><username>yogima<username></User>
就可以转换到实体类对应的字段中了

3、转为json

java">import com.fasterxml.jackson.databind.ObjectMapper;public String toJson(User user) throws Exception {ObjectMapper objectMapper = new ObjectMapper();return objectMapper.writeValueAsString(user);
}

实际上返回给前端的时候也不需要自己手动去writeValueAsString,这里只是做个示例。
上述转为json后字段名使用的还是name,如果需要保持字段名为"username",只需要加上@JsonProperty。

java">import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.fasterxml.jackson.annotation.JsonProperty;@XmlRootElement(name = "User")
@Setter
@ToString
public class User {@JsonProperty("username")private String name;@XmlElement(name = "username")public String getName() {return name;}}

这样看注解有时候还挺多此一举的,直接User类中的字段用username就可以不需要注解;但是比如说返回的字段是<ABC_AA>12345</ABC_AA><AAA>111</AAA>,如果我不去规定@JsonProperty和@XmlElement,直接把字段定义成大写的ABC_AA和AAA,也可以接收到xml参数,但是不符合Java命名规范,而且会发现AAA默认转出来的json字段叫做aaa,而ABC_AA转出来则是abc_AA.所以我们还是加上注释会更优雅一些。

java">@JsonProperty("ABC_AA")
private String abcAa;@XmlElement(name = "ABC_AA")
public String getAbcAa() {return abcAa;
}

4、返回的xml较为复杂,需要提取

java">import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;public class XmlConvertTest {public static void main(String[] args) throws Exception{//模拟较为复杂的xml数据String xmlData = "<response><head><response_id>AA</response_id><request_id>BB</request_id><status_code>200</status_code></head><result><![CDATA[<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>]]></result></response>";//使用正则取出需要的数据内容 即<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>String cdataContent = xmlData.replaceAll("(?s).*?<result><!\\[CDATA\\[(.*?)]]></result>.*", "$1");//裹上rowsString wrappedContent = "<rows>" + cdataContent + "</rows>";JAXBContext jaxbContext = JAXBContext.newInstance(XmlTestDTO.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();XmlTestDTO dto = (XmlTestDTO) unmarshaller.unmarshal(new StringReader(wrappedContent));System.out.println(dto);
}

对应的XmlTestDTO:

java">@XmlRootElement(name = "rows")
@Setter
@ToString
public class XmlTestDTO {private List<XmlRowTest> rows = new ArrayList<>();@XmlElement(name = "row") // 对应每个 <row> 元素public List<XmlRowTest> getRows() {return rows;}//XmlRowTest不需要作为根元素的话,这里可以不用@XmlRootElement注解//@XmlRootElement(name = "row")@Setter@ToStringpublic static class XmlRowTest{@JsonProperty("AAA")private String aaa;@XmlElement(name = "AAA")public String getAaa() {return aaa;}}}

拿到XmlTestDTO dto后只要使用dto.getRows()就能对List<XmlRowTest>进行遍历了


http://www.ppmy.cn/devtools/133030.html

相关文章

【网络安全 | 甲方安全建设】分布式系统、Redis分布式锁及Redisson看门狗机制

未经许可,不得转载。 文章目录 分布式系统分布式系统的核心特性分布式系统的典型架构分布式锁概念Redis 分布式锁原理互斥性锁释放锁的唯一性具体实现Redisson分布式锁分布式系统 分布式系统是一种由多台计算机(节点)组成的系统,这些节点通过网络相互连接并协同工作,共同…

基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析

摘要 本项目旨在基于Python对20个城市的天气数据进行采集与可视化分析&#xff0c;以评估天气的适宜出行度。该分析通过四个主要指标进行量化&#xff0c;这些指标分别是天气状况良好率、空气质量优良率、气温适宜率和安全天气率。通过这些指标&#xff0c;我们能够有效地判断…

【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本

文章目录 一、Ansible安装及远程控制1、关闭防火墙和SELinux2、安装ansible3、配置SSH无密码登录1、在管理机上生成一对密钥2、将公钥下发到远程主机3、保管密钥 4、主机目录 二、常用模块1、setup模块2、copy模块3、file模块4、shell模块5、script模块6、ping模块7、group模块…

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型(含SigLIP详解)

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…

【赵渝强老师】Redis的RDB数据持久化

Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出会造成服务器中的数据库状态也会消失。所以 Redis 提供了数据持久化功能。Redis支持两种方式的持久化&#xff0c;一种是RDB方式&#xff1b;另一种是AOF&#xff08;ap…

基于地铁刷卡数据分析与可视化——以杭州市为例(二)

上篇文章提到&#xff0c;由于2019年1月1日正好是元旦&#xff0c;为了消除节假日对数据分析的影响&#xff0c;我们选择了节后的一周来进行详细的客流分析。具体日期选择为2019年1月8日至1月14日。在这段时间内&#xff0c;我们关注的是地铁线路的进站客流情况。数据表中的 st…

理解虚拟 DOM:Vue 的灵魂之处

理解虚拟 DOM&#xff1a;Vue 的灵魂之处 在现代前端开发中&#xff0c;性能是一个至关重要的考虑因素。Vue.js 作为一款流行的前端框架&#xff0c;其中一个让人称道的特性就是它的“虚拟 DOM”。那么&#xff0c;虚拟 DOM 是什么&#xff1f;它是如何工作的&#xff1f;本文…

Java中的线程安全问题(如果想知道Java中有关线程安全问题的基本知识,那么只看这一篇就足够了!)

前言&#xff1a;多线程编程已经广泛开始使用&#xff0c;其可以充分利用系统资源来提升效率&#xff0c;但是线程安全问题也随之出现&#xff0c;它直接影响了程序的正确性和稳定性&#xff0c;需要对其进行深入的理解与解决。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…