xml转json(dom4j + fastjson)
public static void main(String[] args) {String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +"<customer>\n" +" <id>100</id>\n" +" <name>lanying</name>\n" +" <age>29</age>\n" +" <books>\n" +" <book>\n" +" <id>1</id>\n" +" <name>三国演义</name>\n" +" <price>100.0</price>\n" +" </book>\n" +" <book>\n" +" <id>2</id>\n" +" <name>红楼梦</name>\n" +" </book>\n" +" <book>\n" +" <id>1</id>\n" +" <price>100.0</price>\n" +" </book>\n" +" <book>\n" +" <name>西游记</name>\n" +" <price>50.0</price>\n" +" </book>\n" +" </books>\n" +"</customer>";String data = XmlToJsonUtil.xmlToJson(xml);JSONObject jsonObj = JSONObject.parseObject(data);System.out.println("jsonObj = " + jsonObj); // 层层解析JSONObject customer = jsonObj.getJSONObject("customer");System.out.println("customer = " + customer);JSONObject books = customer.getJSONObject("books");System.out.println("books = " + books);JSONArray jsonArr = books.getJSONArray("book");System.out.println("book = " + jsonArr);for(int i = 0; i < jsonArr.size(); i ++){JSONObject book = jsonArr.getJSONObject(i);System.out.println(book.toJSONString());}
}
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;import java.util.List;public class XmlToJsonUtil {/** xml转json*/public static String xmlToJson(String xml) {try {// xmlStr ==> DocumentDocument doc = DocumentHelper.parseText(xml);// Document ==> jsonStrElement rootEle = doc.getRootElement();JSONObject json = new JSONObject();dom4j2Json(rootEle, json);// 为了让JSON中包含根元素的key,才创建了resultJSON对象JSONObject resultJSON = new JSONObject();resultJSON.put(rootEle.getName(), json);return resultJSON.toJSONString();} catch (DocumentException e) {System.out.println("数据解析失败"); // 可改为打印日志}return null;}/*** 将element里面的内容存入参数json中** @param element* @param json*/private static void dom4j2Json(Element element, JSONObject json) {// Step 1: 如果有属性 形如:<XXX attr="xxx">张三</XXX>for (Object o : element.attributes()) {Attribute attr = (Attribute) o;if (!isEmpty(attr.getValue())) {json.put("@" + attr.getName(), attr.getValue()); // key前加@存入参数json 形如:{"@attr":"value"},可自定义存入格式}}// 获取element的子一级元素List<Element> childElements = element.elements();// Step 2: 形如:<name>张三</name>if (childElements.isEmpty() && !isEmpty(element.getText())) { // 如果没有子元素,只有一个值json.put(element.getName(), element.getText());}// Step 3: 子元素 e是element的子一级元素for (Element e : childElements) { // element有子元素if (e.elements().isEmpty()) { // 子元素e没有子元素(子子元素)// attrfor (Object o : e.attributes()) {Attribute attr = (Attribute) o;if (!isEmpty(attr.getValue())) {json.put("@" + attr.getName(), attr.getValue());}}// <name>张三</name>if (!isEmpty(e.getText())) {json.put(e.getName(), e.getText());}} else { // 子元素也有子元素JSONObject childJson = new JSONObject();dom4j2Json(e, childJson); // 递归,将e中的数据存入childJsonObject o = json.get(e.getName()); // 通过这个子元素e的key从参数json中获取内容if (o == null) { // 说明json中没有存入过该类型的子元素,则当前的childJson作为第一个元素存入参数jsonif (!childJson.isEmpty()) {json.put(e.getName(), childJson);}} else { // json中已经存入过该类型的子元素,说明不止一个,需要转成数组形式存入参数jsonJSONArray jsonArr = null;if (o instanceof JSONObject) { // 当前o是之前存入的子元素,即"第一个子元素"JSONObject jsonObj = (JSONObject) o;json.remove(e.getName()); // 删除之前的JSONObject(稍候以JSONArray形式存入)jsonArr = new JSONArray(); // 新建JSONArrayjsonArr.add(jsonObj); // 添加"第一个子元素"jsonArr.add(childJson); // 添加当前子元素} else if (o instanceof JSONArray) { // 如果已经存在JSONArray,则直接在该JSONArray中添加jsonArr = (JSONArray) o;jsonArr.add(childJson); // 添加当前子元素}json.put(e.getName(), jsonArr); // {e:[{child1},{child2},{child3}]}}}}}public static boolean isEmpty(String str) {if (str == null || str.trim().isEmpty() || "null".equals(str)) {return true;}return false;}}
Maven依赖
dom4j 和 fastjson
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.1</version>
</dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version>
</dependency>
结果
jsonObj的内容:
{"customer": {"books": {"book": [{"price": "100.0","name": "三国演义","id": "1"},{"name": "红楼梦","id": "2"},{"price": "100.0","id": "1"},{"price": "50.0","name": "西游记"}]},"name": "lanying","id": "100","age": "29"}
}
学习网址
【xml转换成json】https://www.cnblogs.com/liushisaonian/p/8657555.html
【Dom4j中getStringValue()和getText()用法和区别】https://blog.csdn.net/www_wangjun/article/details/71404204
【fastjson中toString与toJSONString的差别】https://www.cnblogs.com/zouhong/p/12091493.html
【xml <=> json在线转换工具】https://www.bejson.com/xml2json/
【JSONobject按照put顺序存储和读取】https://blog.csdn.net/dushu990/article/details/80670088
xml转json(dom4j + fastjson)相关推荐
- 【4-8】《XML与JSON》——XML、解析XML、SAX、DOM4J、XStream、JSON、Gson、Fastjson
文章目录 XML与JSON 一.XML 1.XML概述 1.XML语法格式 2.语法进阶CDATA(了解) 2.解析XML 1.SAX解析 2.DOM解析 3.JDOM解析 4.DOM4J解析 3.D ...
- XML与JSON 及其对应的Java包 Gson FastJson
4-8 XML与JSON XML概述 可扩展标记语言: xml与平台无关,是一门独立的标记语言.与任何编程语言无关. xml具有自我描述性,能够清晰地展现其特性. xml数据不一定是文件形式存储,也可 ...
- XML和JSON 数据交换格式
为什么80%的码农都做不了架构师?>>> 一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...
- JavaSE——XML与JSON(语法格式、解析内容)
第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...
- XML 与 JSON 解析教程
目录 前言 一.XML 是什么? 1.1 简介 1.2 为什么要学习 XML? 1.3 XML 文件 1.4 XML 语法格式 二.JSON 2.1 简介 2.2 对象格式 2.3 数组格式 2.4 ...
- XML与JSON的生成与解析
1. XML 1.1 XML简介 可标记语言(extensible Markup Language) 特性: XML具有平台无关性,是一门独立的语言 XML具有自我描述性 XML功能: 网络传输文件 ...
- xml、json、url的一些简单介绍
一:XML 和 JSON 的简单介绍 xml 和 json 都是程序和程序之间传送和交流数据的方式. 都是独立于 各种编程语言 而存在的. 早些时间 xml 用的非常多,后来 json 出现了,jso ...
- XML与JSON(超级详解)
XML与JSON 文章目录 XML与JSON 前言 一.XML简介 1.1.XML是什么? 1.2.为什么学习XML 1.3.XML文件 1.4.XML语法格式 1.5.语法进阶CDATA (了解) ...
- XML与Json比较
XML与JSON解析 一.XML与JSON是什么? XML 和 JSON 是现今互联网中最常用的两种数据交换格式..虽然这两种格式的设计目标并不相同,但它们常常用于同一个任务,也就是数据交换中.XML ...
- Java学习(第十二天)XML和JSON
XML和json XML:可扩展标记语言(eXtensible Markup Language) 特性: 1.xml具有平台无关性,是一门独立的标记语言 2.xml具有自主描述性 学习xml的理由: ...
最新文章
- 批量下载文件,循环中文件流没有关闭导致每次下载会累加之前的下载文件
- Python pytagcloud 中文分词 生成标签云 系列(一)
- android银行卡匹配、详情展开动画、仿爱奇艺视频拖拽、扫码识别手机号等源码...
- 使用apply调用函数
- java安装库源文件_JOGL安装
- 实验三 Linux的启动与关闭,实验三:跟踪分析Linux内核的启动过程
- P3076,jzoj3187-的士【贪心】
- C:C++ 函数返回多个参数
- SpringBoot集成Maven工程
- python面试1000题之4-6
- C语言实现常用排序算法——基数排序
- 关于在CLASSWIZARD中找不到工作区间中的类的解决方法
- 话单分析账单分析行踪分析综合数据研判软件
- 微信小程序获取用户手机号
- poj3537 Crosses ans Crosses
- android 带刻度的滑动条_Android自定义滑动刻度尺
- Computer Architectrure: Quantitative Approch 第三章第四节
- html 网站发布到公网
- PD-GAN: Probabilistic Diverse GAN for Image Inpainting
- 使用ubuntu遇到的问题-An error occurred,please run Package Manager...
热门文章
- ShadowGun代码
- 联想服务器加装显卡无显示,标配11201355主板的启天M4330在 Win8系统加装独立显卡“无显无报警”...
- STM32L452CCU6 STM32L432KCU6 GD32F407VKT6 嵌入式技术数据手册 32位ARM
- 客房管理系统前台代码html,中顶酒店客房前台管理系统
- 《密码编码学与网络安全》William Stalling著---学习笔记(一)【知识点速过】【传统密码+经典对称加密算法+经典公钥密码算法+密码学Hash函数】
- 【转】通过《淘宝这十年》总结的脑图
- 卡西欧计算机做英语,卡西欧的这个小萌物 原来是台英语学习机
- 华为eNSP三层架构网络配置
- golang mysql null_Golang将变量声明为NULL
- 字节跳动怎么都十万人了?