FastJson==xml与json格式互转工具类

一、xml格式介绍

XML(eXtensible Markup Language)是一种标记语言,它的设计目的是为了存储和传输数据,而不是用于显示数据,这一点与HTML(HyperText Markup Language)不同。以下是XML的一些关键特点和用途的介绍:

  1. 自我描述性
    XML文档使用标签(tags)来描述数据的结构和含义,这些标签是自定义的,不同于HTML中的预定义标签。
    例如, < e m p l o y e e > 、 < n a m e > 、 < a g e > <employee>、<name>、<age> <employee><name><age>等都是用户定义的标签,用于表示员工信息的不同部分。

  2. 可扩展性:
    用户可以根据需要定义自己的标签集,这使得XML能够适应各种各样的数据模型。
    标签的命名不受限制,只要遵循一定的命名规则即可。

  3. 结构化数据:
    XML文档通常具有层次结构,即元素(elements)可以嵌套在其他元素内,形成树状结构。
    这种结构使得解析和处理XML数据变得相对容易。

  4. 平台和语言无关:
    XML是跨平台的,可以在任何支持XML解析器的系统上使用。
    它也是语言无关的,可以被多种编程语言处理。

  5. 数据交换的标准:
    由于其结构化和自我描述的特性,XML成为不同系统间交换数据的常见格式。
    许多API和Web服务都使用XML作为数据传输的格式。

  6. XML Schema 和 DTD:
    XML文档可以使用XML Schema(XSD)或Document Type Definitions(DTD)来定义文档的结构和数据类型,从而保证数据的一致性和有效性。

  7. 与CSS和XSLT的结合:
    尽管XML不关心数据的显示,但它可以与CSS(Cascading Style Sheets)结合来控制文档的外观。
    XSLT(XSL Transformations)则用于将XML转换成其他格式,如HTML或PDF。

  8. 配置文件:
    XML常用于应用程序的配置文件,因为它提供了清晰的数据组织方式。

  9. 解析和验证:
    存在多种库和工具(如Java的DOM, SAX, StAX等)用于解析XML文档,验证其结构和内容是否有效。

  10. 缺点:
    相比于二进制格式,XML文档通常较大,占用更多存储和传输资源。
    解析和生成XML也需要更多的计算资源。

总之,XML是一种灵活且广泛使用的数据表示和交换格式,特别是在需要结构化数据和跨系统集成的场景下。

xml格式示例:

<?xml version="1.0" encoding="UTF-8"?>
<catalog><!-- 书籍条目 --><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book><!-- 另一本书条目 --><book id="bk102"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date><description>A former architect battles corporate zombies.</description></book><!-- 更多书籍条目可以继续添加... --></catalog>

在这个示例中,catalog是根元素,它包含了两个book元素,每个book元素都有自己的属性(如id)和子元素(如author、title等)。属性值放在引号中,并且紧跟在元素名之后,使用空格分隔。元素内容可以是纯文本,或者进一步包含其他元素。此外,注释以 包裹,用来提供非结构化的文本信息。

二、json格式介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以文本形式存储和交换数据,易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,但它是语言无关的,可以被多种编程语言支持。以下是JSON格式的关键特点和组成部分:

  1. 对象(Object):
  • 对象在JSON中用花括号 {} 包裹。
  • 对象由零个或多个键值对(key-value pairs)组成,键值对之间用逗号 , 分隔。
  • 键(key)是字符串,用双引号 " " 包围,值(value)可以是各种数据类型,包括字符串、数字、布尔值、数组、null,甚至是另一个JSON对象。
  • 键和值之间用冒号 : 分隔,如:“key”: value。
  1. 数组(Array):
  • 数组在JSON中用方括号 [] 包裹。
  • 数组由零个或多个值组成,值之间用逗号 , 分隔。
  • 数组中的值可以是任意数据类型,包括其他JSON对象或数组。
  1. 数据类型:
  • 字符串(String): 使用双引号包围,如 “example string”。
  • 数字(Number): 可以是整数或浮点数,如 42 或 3.14。
  • 布尔值(Boolean): true 或 false。
  • null: 代表空值,只有一种形式:null。
  • 空值(Empty): JSON没有单独的空值,通常用 null 表示。
  1. 语法规范:
  • 所有的键必须是字符串,且必须用双引号包围,不能用单引号。
  • JSON数据必须有正确的缩进和换行,以保持良好的可读性,但不是必需的。
  • JSON不允许包含注释,与JavaScript不同。
  1. JSON与JavaScript对象的关系:
  • 在JavaScript中,JSON格式可以直接转换为JavaScript对象,反之亦然。
  • JavaScript对象与JSON对象的区别在于JSON是字符串形式,而JavaScript对象是实际的对象实例。
  1. JSON与XML比较:
  • JSON通常比XML更紧凑,因此在网络传输中更高效。
  • JSON解析和生成通常更快,因为其语法更简单。
  • JSON更适合人类直接阅读和编写,而XML更适合机器解析和验证。
  1. JSON-LD:
    JSON-LD(JSON for Linked Data)是JSON的一个扩展,用于在Web上表示语义数据,它允许将JSON数据与RDF(Resource Description Framework)框架结合,增强了数据的互操作性。

简单数据示例:

{"name": "John Doe","age": 35,"isStudent": false,"hobbies": ["reading", "gaming"],"address": {"street": "123 Main St","city": "New York","country": "USA"}
}

三、解析工具类代码


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;/*** fastjson工具类(需要引入fastjson和dom4j的pom依赖)* @author hulei* @Date 2023/3/15 17:18*/
public class FastJsonUtil {/*** xml转fastjson* @param xml 待转换数据xml字符串* @return JSONObject对象*/public static JSONObject xmlToFastJson(String xml){JSONObject jsonObject = null;try {jsonObject = new JSONObject();Document document = DocumentHelper.parseText(xml);// 获取根节点元素对象Element root = document.getRootElement();iterateNodes(root, jsonObject);}catch (Exception e){return jsonObject;}return jsonObject;}/*** fastjson转xml* @param jsonStr 待转换json字符串* @param escape  是否忽略特殊字符(即特殊字符转xml后追加CDATA)* @return*/public static String fastJsonToXml(String jsonStr,Boolean escape) {try {StringBuffer buffer = new StringBuffer();//带顺序JSONObject json = JSONObject.parseObject(jsonStr, Feature.OrderedField);jsonToXmlStr(json,buffer, escape != null && escape);return buffer.toString();} catch (Exception e) {e.printStackTrace();return "";}}/*** object转JSONObject* @param t* @param <T>* @return*/public static <T> JSONObject objectToJSONObject(T  t){return  JSONObject.parseObject(JSON.toJSONString(t));}/*** json字符串转实体对象* @param jsonString* @param clazz* @param <T>* @return*/public static <T> T jsonStrToEntity(String jsonString,Class<T> clazz){return JSONObject.parseObject(jsonString,clazz);}public static void iterateNodes(Element node, JSONObject json) {// 获取当前元素的名称String nodeName = node.getName();// 判断已遍历的JSON中是否已经有了该元素的名称if (json.containsKey(nodeName)) {// 该元素在同级下有多个Object Object = json.get(nodeName);JSONArray array;if (Object instanceof JSONArray) {array = (JSONArray) Object;}else {array = new JSONArray();array.add(Object);}// 获取该元素下所有子元素List<Element> listElement = node.elements();if (listElement.isEmpty()) {// 该元素无子元素,获取元素的值String nodeValue = node.getTextTrim();array.add(nodeValue);json.put(nodeName, array);return;}// 有子元素JSONObject newJson = new JSONObject();// 遍历所有子元素for (Element e : listElement) {// 递归iterateNodes(e, newJson);}array.add(newJson);json.put(nodeName, array);return;}// 该元素同级下第一次遍历// 获取该元素下所有子元素List<Element> listElement = node.elements();if (listElement.isEmpty()) {// 该元素无子元素,获取元素的值String nodeValue = node.getTextTrim();json.put(nodeName, nodeValue);return;}// 有子节点,新建一个JSONObject来存储该节点下子节点的值JSONObject object = new JSONObject();// 遍历所有一级子节点for (Element e : listElement) {// 递归iterateNodes(e, object);}json.put(nodeName, object);return;}private static void jsonToXmlStr(JSONObject json,StringBuffer buffer,Boolean isEscape){Iterator<Map.Entry<String,Object>> it = json.entrySet().iterator();Map.Entry<String,Object> en;while(it.hasNext()){en = it.next();if(en.getKey().startsWith("-")){continue;}if(en.getKey().equals("#text")){//直接输出文本buffer.append(en.getValue());continue;}if(en.getValue() instanceof JSONObject){buffer.append("<").append(en.getKey()).append(getAttr((JSONObject) en.getValue())).append(">");JSONObject jo = json.getJSONObject(en.getKey());jsonToXmlStr(jo,buffer,isEscape);buffer.append("</").append(en.getKey()).append(">");}else if(en.getValue() instanceof JSONArray){JSONArray jsonArray = json.getJSONArray(en.getKey());for (int i = 0; i < jsonArray.size(); i++) {JSONObject jsonobject =  jsonArray.getJSONObject(i);buffer.append("<").append(en.getKey()).append(getAttr(jsonobject)).append(">");jsonToXmlStr(jsonobject,buffer,isEscape);buffer.append("</").append(en.getKey()).append(">");}}else{buffer.append("<").append(en.getKey()).append(">").append(isEscape ? escape(String.valueOf(en.getValue())) : String.valueOf(en.getValue())).append("</").append(en.getKey()).append(">");}}}/*** 拼当前节点属性* @param json* @return*/private static String getAttr(JSONObject json){StringBuilder sb = new StringBuilder();for(Map.Entry<String,Object> entity:json.entrySet()){if(entity.getKey().startsWith("-")){sb.append(" ").append(entity.getKey().substring(1)).append("=\"").append(entity.getValue().toString()).append("\"");}}return sb.toString();}/*** 特殊字符pattern*/private static Pattern pattern = Pattern.compile("[<>&\"',]");/*** json转xml中遇到特殊字符对内容追加![CDATA[]]* @param string* @return*/private static String escape(String string) {return pattern.matcher(string).find() ? "<![CDATA[" + string + "]]>" : string;}/*** 判断是否是JSON数组* @param str* @return*/public static boolean isJsonArray(String str) {if (str.isBlank()) {return false;}return isWrap(str.trim(), '[', ']');}public static boolean isWrap(CharSequence str, char prefixChar, char suffixChar) {if (null == str) {return false;}return str.charAt(0) == prefixChar && str.charAt(str.length() - 1) == suffixChar;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流畅的python-学习笔记_协议+继承优缺点

接口和协议 python动态语言&#xff0c;没有interface等概念&#xff0c;接口和协议方法有的也有替代品&#xff0c;所以类似于鸭子类型&#xff0c;只关注行为像鸭子&#xff0c;不关注它是不是鸭子。不是每个接口都得实现&#xff0c;这是允许的 猴子补丁 可动态给对象添加…

Java的BIO/NIO/AIO

1. Java中的BIO、NIO和AIO的基本概念及其主要区别 BIO (Blocking I/O): 传统的同步阻塞I/O模型。每个连接创建成功后都需要一个线程来处理&#xff0c;如果连接没有数据可读&#xff0c;则线程会阻塞在读操作上。这种模型简单易理解&#xff0c;但在高并发环境下会消耗大量系统…

ORACLE 19C RAC DIAG进程消耗大量内存的分析

近期一个ORACLE 19C的RAC环境&#xff0c;多次出现数据库实例的后台进程DIAG消耗很多内存&#xff08;达到20G&#xff09;&#xff0c;节点1、节点2都出现过次问题。 问题分析&#xff1a;通过对DIAG进程TRACE分析&#xff0c;结合在ORACLE官方后台进行问题、BUG查询匹配&…

【ITK配准】第七期 尺度(Metric)-Kullback-Leiber距离Metric

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的互信息Metric,即itk::KullbackLeiblerCompareHistogramImageToImageMetric,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! …

全局测试用例环境和访问共享资源的GoogleTest教程

全局测试用例环境和访问共享资源的GoogleTest教程 介绍 在软件开发中&#xff0c;测试是确保软件质量的关键步骤之一。GoogleTest是一个流行的C测试框架&#xff0c;它提供了丰富的功能来编写和运行测试用例。在实际的软件项目中&#xff0c;有时需要在测试用例之间共享一些资…

思腾合力受邀参加VALSE 2024视觉与学习青年学者研讨会

在充满学术氛围的五月&#xff0c;思腾合力荣幸受邀参加了于2024年5月5-7日在重庆举行的第十四届VALSE大会。作为视觉与学习领域的顶级交流平台&#xff0c;VALSE大会每年都吸引着全国专家与学者的目光。 本次大会不仅延续了往届的高水平学术研讨&#xff0c;还进一步拓宽了研究…

台湾精锐APEX行星减速机噪音产生及优化策略

台湾精锐APEX行星减速机在各种机械装置中的应用逐渐广泛。然而&#xff0c;其噪音问题也日益凸显。噪音不仅影响工作环境&#xff0c;还可能对设备的正常运行和使用寿命产生负面影响。因此&#xff0c;了解APEX行星减速机噪音的产生以及优化噪音问题变得至关重要。 APEX行星减…

安卓自动化脚本制作流程详解!

在移动应用日益普及的今天&#xff0c;安卓自动化脚本制作成为了开发者提高工作效率、减少重复劳动的重要手段&#xff0c;本文将详细介绍安卓自动化脚本的制作流程&#xff0c;并通过五段源代码的实例&#xff0c;帮助读者更好地理解和掌握这一过程。 一、安卓自动化脚本制作…

从U盘到云端:企业数据泄露的那些事

在企业的日常运营中&#xff0c;数据安全无疑是极为关键的一环。无论是U盘还是云&#xff0c;数据泄露事件的发生都可能导致企业的核心机密被窃取&#xff0c;甚至损害企业的商业利益和声誉。以下是关于从U盘到云端&#xff0c;企业数据泄露的一些常见情况和应对策略。 U盘&…

各种流量包特征

[CVE-2013-1966] Apache Struts2 远程命令执行漏洞 要执行的命令在exec里面&#xff0c;而且回显数据包里面有明显执行结果回显 [CVE-2017-8046] Spring Data Rest 远程命令执行漏洞 回显不明显&#xff0c;考试提供的解码工具不能解密&#xff0c; [CVE-2017-12149] JBOSS…

Kibana初始化启动失败原因及解决办法

一&#xff09; Unable to retrieve version information from Elasticsearch nodes 报错日志&#xff1a; 折叠源码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [rootnode1 bin]# ./kibana --allow-root log [16:03:07.086] [info][plugins-service] Plugin &…

揭秘全网热门话题:抖音快速涨粉方法,巨量千川投流助你日增10000粉

在当今社交媒体的时代( 千川投流&#xff1a;hzzxar&#xff09;抖音成为了年轻人分享自己才华和生活的平台。然而&#xff0c;要在抖音上快速获得关注和粉丝&#xff0c;却不是一件容易的事情。今天&#xff0c;我们将揭秘全网都在搜索的抖音快速涨1000粉的秘籍&#xff0c;带…

API攻击为啥盛行,企业应该如何防范

一.API接口到底是什么 API,中文名称叫应用程序编程接口,是现代移动、SaaS 和 Web应用程序的一个关键组成部分。听起来很晦涩难懂,但其实我们每个人的生活都会接触 API:早上出门,打开手机看看天气,天气APP需要通过 API 提取数据;到了公司,被安排出差,赶紧上网查票,购票网站更新…

Python 基础入门

文章目录 路线配置环境2.语言3.数据结构 小结 路线 最近在写点东西&#xff0c;也在用一门之前没怎么用过的语言&#xff1b;python。写下我的学习途径及方法&#xff0c;仅供参考。 配置环境语言学习数据结构一些库的学习等等 配置环境 最开始&#xff0c;我用的事pycharm…

【3dmax笔记】027:配置修改器集、工具栏自定义与加载

文章目录 一、配置修改器集二、自定义工具栏三、加载工具栏 一、配置修改器集 可以把自己常用的修改命令放到右边框中的部分&#xff0c;便于自己的操作&#xff0c;省去了每次都要花半天时间找命令的尴尬。新建一个二维或者三维物体&#xff0c;点击修改面板&#xff0c;点击…

运算符重载:妈妈我会自己写运算符了

目录 一、题目&#xff1a; 二、分析&#xff1a; 1.矩阵&#xff08;matrix&#xff09;部分&#xff1a; 2.程序部分&#xff1a; 三、代码&#xff1a; 四、提升&#xff1a; 1、思路&#xff1a; 2、重载流插入运算符“<<” 3、代码&#xff1a; 五、进阶&…

尊享面试100题(314.二叉树的垂直遍历python)

题目关键词&#xff0c;从左到右&#xff0c;从上到下&#xff0c;那么使用bfs宽度优先算法。 使用字典v保存每一列的值。 class Solution:def verticalOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []v defaultdict(list)qu deque()…

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…

C 语言笔记:字符串处理函数

一、获取字符串长度函数 头文件&#xff1a;#include <string.h> 函数定义&#xff1a;size_t strlen(const char *s); 函数功能&#xff1a; 测字符指针 s 指向的字符串中字符的个数&#xff0c;不包括’\0’ 返回值&#xff1a;字符串中字符个数 #include <stdio.…

怿星科技CEO潘凯:汽车软件研发工具链 国产玩家迎「历史性机会」

「智能汽车时代&#xff0c;国内非常有机会出现类似Vector的企业。」 这是怿星科技CEO潘凯深信的事情&#xff0c;他在行业内已经深耕约18年&#xff0c;创业也已经10年有余&#xff0c;带领着一个约300人的公司&#xff0c;2024年4月与高工智能汽车见面时&#xff0c;正值公司…