FastJson的使用

一、介绍

​在前后端数据传输交互中,经常会遇到字符串JSONXML等格式相互转换与解析,其中JSON以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。FastJson是阿里巴巴用Java语言编写的高性能且功能完善的JSON库,用于对JSON格式的数据进行解析。FastJSON 是一个开源项目,你可以在 GitHub 上找到它的源代码和文档。

二、FastJson使用

第一步:导入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><!--(起码1.2.48以上)因为这个版本一下存在漏洞--><version>版本根据自己需要</version>
</dependency>

第二步:具体使用

FastJson 提供了大量的方法来处理 JSON 数据。以下是其中一些常用的方法。另外,我们知道 JSON 字符串大多是很多嵌套了很多层的,我们可以通过链式调用获取底层的 JSON 字符串所对应的 JSONObject 对象。

//把JSON文本解析为JSONObject或者JSONArray
public static final Object parse(String text); //把JSON文本解析成JSONObject
public static final JSONObject parseObject(String text);  //把JSON文本解析为JavaBean
public static final <T> T parseObject(String text, Class<T> clazz);  //把JSON文本解析成JSONArray。只有字符串是JSON数组的时候才能转,不然会报错。
public static final JSONArray parseArray(String text);  //把JSON文本解析成JavaBean集合
public static final <T> List<T> parseArray(String text, Class<T> clazz);  //将JavaBean序列化为JSON文本 
public static final String toJSONString(Object object); //将JavaBean序列化为带格式的JSON文本
public static final String toJSONString(Object object, boolean prettyFormat);  //将JavaBean转换为JSONObject或者JSONArray。
public static final Object toJSON(Object javaObject); 

三、XML和JSON之间的转换

某些情况下,我们也会涉及到 XML 格式的字符串和 JSONObject 对象之间的转换,可使用下面的工具类完成:

第一步:导入FastJson和dom4j的依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><!--(起码1.2.48以上)因为这个版本一下存在漏洞--><version>版本根据自己需要</version>
</dependency>
<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>

第二步:在项目的工具类包下添加下面的工具类即可使用

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工具类*/
public class FastJsonUtil {/*** xml字符串转为fastjson中的JSONObject对象* @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中JSONObject对象的转为xml字符串* @param jsonStr 待转换json字符串* @param escape  是否忽略特殊字符(即特殊字符转xml后追加CDATA)* @return xml字符串*/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 待转换的Java对象* @return JSONObject对象*/public static <T> JSONObject objectToJSONObject(T  t){return  JSONObject.parseObject(JSON.toJSONString(t));}/*** json字符串转实体对象* @param jsonString json字符串* @param clazz 实体对象的类型* @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 JSON字符串* @return true或false*/public static boolean isJsonArray(String str) {if (str.isEmpty()) {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/2419.shtml

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

相关文章

第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

第二十六天 一、PHP新闻显示-数据库操作读取显示 1.新闻列表 数据库创建新闻存储代码连接数据库读取页面进行自定义显示 二、PHP模版引用-自写模版&Smarty渲染 1.自写模版引用 页面显示样式编排显示数据插入页面引用模版调用触发 2.Smarty模版引用 1.下载&#xff1a…

kafka-spring实现对于topic的监听的开启、暂停、暂停后重新开始、停止

kafka-spring实现对于topic的监听的开启、暂停、暂停后重新开始、停止 直接上代码 import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.AdminClientConfig; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.a…

BitmapIndex Scan 与BitmapHeap Scan

BitmapIndex Scan 与BitmapHeap Scan BitmapIndex Scan 与Index Scan 很相似&#xff0c;都是基于索引的扫描&#xff0c;但是BitmapIndex Scan 节点每次执行返回的是一个位图而不是一个元组&#xff0c;其中位图中每位代表了一个扫描到的数据块。而BitmapHeap Scan一般会作为…

4月23日,每日信息差

第一、目前全国共确定工伤保险异地就医直接结算试点城市131个&#xff0c;开通上线工伤医疗、工伤康复、辅助器具配置协议机构共398家。工伤职工按规定完成备案&#xff0c;持社保卡或电子社保卡可以到试点城市的协议机构直接结算相关费用 第二、极兔快递仅用 4 年成为中国国内…

算法和数据结构4.23:

1.测试工程师算法总结&#xff1a; L1排序和查找算法&#xff1a; 复杂度分析 查找算法&#xff1a;顺序查找、二分查找、其他查找算法 排序算法&#xff1a;冒泡排序、快速排序、其他排序算法 L2数据结构-线性表&#xff1a;链表、栈、队列、堆 L3数据结构-非线性表&…

信创传输软件,如何进行国产化替代?

信创产业&#xff0c;即信息技术应用创新产业&#xff0c;它与“863 计划”“973 计划”“核高基” 一脉相承&#xff0c;是我国 IT 产业发展升级采取的长期计划。网络安全事件频发后&#xff0c;中国要确保 IT 相关设施的全部环节国产化&#xff0c;任何不能保证自主可控的环节…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

终于有人说明白了session、cookie和token的区别

一、首先介绍一下名词&#xff1a;Session、cookie、token&#xff0c;如下&#xff1a; 1.Session会话&#xff1a;客户端A访问服务器&#xff0c;服务器存储A的数据value&#xff0c;把key返回给客户端A&#xff0c;客户端A下次带着key&#xff08;session ID&#xff09;来…

(一)输入验证(语法和语义)

你无法控制进入应用程序的内容&#xff0c;甚至无法控制从数据库进入的内容&#xff0c;因为这些数据之前可能已经注入了。日期&#xff0c;如1900年 不是一个有效的日期&#xff0c;应确保在预期的范围内。因此&#xff0c;任何来自你控制的领域之外的东西&#xff0c;比如来自…

一文浅谈FRTC8563时钟芯片

FRTC8563是NYFEA徕飞公司推出的一款实时时钟芯片&#xff0c;采用SOP-8封装形式。这种封装形式具有体积小、引脚间距小、便于集成等特点&#xff0c;使得FRTC8563能够方便地应用于各种电子设备中。 FRTC8563芯片基于32.768kHz的晶体振荡器工作&#xff0c;这种频率的晶体振荡器…

2024年特种作业操作证(登高架设作业)考试题库及答案

一、选择题 1.带电跨越架宜采用干燥的竹竿、杉杆搭设&#xff0c;严禁使用&#xff08;  &#xff09;等。 A.钢管 B.松木 C.柳木 答案:A 2.跨越架立杆间距为&#xff08;  &#xff09;m。 A.1.2 B.1.5 C.1.8 答案:B 3.跨越架杆件相交时&#xff0c;不得一扣…

生活无趣感的成因与破解之道

在日常生活中&#xff0c;我们不时会听到身边人感慨&#xff1a;“生活真是无趣。”这种感受仿佛超越了年龄、性别、职业界限&#xff0c;成为现代社会的一种普遍情绪。然而&#xff0c;生活本身蕴含着无数色彩与可能&#xff0c;为何在许多人眼中却显得如此平淡乏味&#xff1…

JavaSE——程序逻辑控制

1. 顺序结构 顺序结构 比较简单&#xff0c;按照代码书写的顺序一行一行执行。 例如&#xff1a; public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(333);} 运行结果如下&#xff1a; 如果调整代码的书写顺序 , …

(ICML-2021)从自然语言监督中学习可迁移的视觉模型

从自然语言监督中学习可迁移的视觉模型 Title&#xff1a;Learning Transferable Visual Models From Natural Language Supervision paper是OpenAI发表在ICML 21的工作 paper链接 Abstract SOTA计算机视觉系统经过训练可以预测一组固定的预定目标类别。这种受限的监督形式限制…

在 Kubernetes 1.24 中使用 Docker:配置与应用指南

在 Kubernetes 1.24 中使用 Docker&#xff1a;配置与应用指南 引言 随着 Kubernetes 社区对容器运行时接口&#xff08;CRI&#xff09;的标准化推进&#xff0c;Docker 原生支持在 Kubernetes 1.24 版本中被弃用。然而&#xff0c;许多开发者和组织仍希望继续使用 Docker。…

服务器基本故障和排查方法

前言 服务器运维工作中遇到的问题形形色色&#xff0c;无论何种故障&#xff0c;都需要结合具体情况&#xff0c;预防为主的思想&#xff0c;熟悉各种工具和技术手段&#xff0c;养成良好的日志分析习惯&#xff0c;同时建立完善的应急预案和备份恢复策略&#xff0c;才能有效…

工业设备管理平台

在这个数字化、智能化的新时代&#xff0c;工业设备管理平台正成为推动工业转型升级的重要力量。在众多平台中&#xff0c;HiWoo Cloud以其卓越的性能、稳定的服务和创新的理念&#xff0c;赢得了广大用户的青睐。今天&#xff0c;就让我们一起走进HiWoo Cloud的世界&#xff0…

WebSocket的原理、作用、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 WebSocket是什么WebSocket的原理WebSocket的作用全双工和半双工客户端【浏览器】API服务端 【Java】APIWebSocket的生命周期WebSocket的常见注解SpringBoot简单代码示例 WebSocket是什么 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向…

123.Mit6.S081-实验1-Xv6 and Unix utilities

今天我们来进行Mit6.S081实验一的内容。 实验任务 一、启动xv6(难度&#xff1a;Easy) 获取实验室的xv6源代码并切换到util分支。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git checkout util Branch util …

QML语法计基础二

1.Item 所有可视化类型的基类 可以作为容器,里面包含各种可视化类 1.1 opacity不透明度 取值范围&#xff1a;0.0-1.0 父容器的不透明度会影响到子容器,如果要设置不透明度&#xff0c;只需要更改子容器的不透明度即可 1.2 visible可见与enable启用 visible 可视化控件的可见…