Java接收xml格式参数转为json的方法

 更新时间:2024年11月12日 09:50:00   作者:yogima  
文章主要介绍了如何使用JAXB将XML格式的参数接收并转换为Java实体类,然后将实体类转换为JSON格式,文中提到在实体类中使用`@XmlElement`和`@JsonProperty`注解的重要性,以及如何处理复杂的XML结构

1、定义实体类

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对接 转为实体类

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

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。

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.所以我们还是加上注释会更优雅一些。

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

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

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><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");
    // 如果需要提取head部分 即<response_id>AA</response_id><status_code>200</status_code>
    // String headContent = xmlData.replaceAll("(?s).*?<head>(.*?)</head>.*", "$1");
    //裹上rows
    String 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:

@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
	@ToString
    public static class XmlRowTest{
        @JsonProperty("AAA")
        private String aaa;
        @XmlElement(name = "AAA")
        public String getAaa() {
            return aaa;
        }
    }
}

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

到此这篇关于Java接收xml格式参数转为json的文章就介绍到这了,更多相关java xml转为json内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 理解Spring中的依赖注入和控制反转

    理解Spring中的依赖注入和控制反转

    这篇文章主要介绍了理解Spring中的依赖注入和控制反转,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 通过Java带你了解网络IO模型

    通过Java带你了解网络IO模型

    这篇文章将通过Java带大家了解网络IO模型,包括BIO,NoBlockingIO,NIO(NewIO),AIO等做了详细得介绍,感兴趣的小伙伴可以参考阅读本文
    2023-05-05
  • Java中Http连接的两种方式(小结)

    Java中Http连接的两种方式(小结)

    这篇文章主要介绍了Java中Http连接的两种方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java内存区域管理详解

    Java内存区域管理详解

    这篇文章主要介绍了Java内存区域管理详解,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 在java上使用亚马逊云储存方法

    在java上使用亚马逊云储存方法

    这篇文章主要介绍了在java上使用亚马逊云储存方法,首先写一个配置类,写一个controller接口调用方法存储文件,本文结合示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01
  • SpringCloud Config使用本地仓库及map注入

    SpringCloud Config使用本地仓库及map注入

    这篇文章主要介绍了SpringCloud Config使用本地仓库及map注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 深入了解Spring的Bean生命周期

    深入了解Spring的Bean生命周期

    这篇文章主要为大家介绍了Spring的Bean生命周期,文中的示例代码讲解详细,对我们学习或工作有一定的参考价值,感兴趣的可以学习一下
    2022-01-01
  • java在hashmap初始化时赋初值过程解析

    java在hashmap初始化时赋初值过程解析

    这篇文章主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 两天没解决的问题chatgpt用了5秒搞定隐藏bug

    两天没解决的问题chatgpt用了5秒搞定隐藏bug

    这篇文章主要为大家描述了我用了两天没解决的问题chatgpt用了5秒搞定的全程介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • SpringBoot RestTemplate 简单包装解析

    SpringBoot RestTemplate 简单包装解析

    这篇文章主要介绍了SpringBoot RestTemplate 简单包装解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论