数据格式转换,数据解析,实体类、json、map、xml

2024-05-24 08:38

本文主要是介绍数据格式转换,数据解析,实体类、json、map、xml,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在做项目时,自己的系统经常需要与别的系统交互,实质上是数据的交互,这就牵涉到数据格式的转换,本篇总结一下常用的几种数据格式转换,主要有实体类与json、map、xml格式的相互转换。

       1、json与实体类互相转换

        工具类:     

package cn.usi.zhjt.pay.util;import java.io.IOException;import org.codehaus.jackson.map.ObjectMapper;
import org.json.JSONException;
import org.json.JSONObject;
/*** 实体类和JSON对象之间相互转化* 依赖包jackson-all-1.7.6.jar、jsoup-1.5.2.jar*/ 
public class JSONUtil {/*** 将json转化为实体POJO* @param jsonStr* @param obj* @return*/public static<T> Object JSONToObj(String jsonStr,Class<T> obj) {T t = null;try {ObjectMapper objectMapper = new ObjectMapper();t = objectMapper.readValue(jsonStr,obj);} catch (Exception e) {e.printStackTrace();}return t;}/*** 将实体POJO转化为JSON* @param obj* @return* @throws JSONException* @throws IOException*/public static<T> JSONObject objectToJson(T obj) throws JSONException, IOException {ObjectMapper mapper = new ObjectMapper();  // Convert object to JSON string  String jsonStr = "";try {jsonStr =  mapper.writeValueAsString(obj);} catch (IOException e) {throw e;}return new JSONObject(jsonStr);}}

       demo:

 

       json转换为实体类

 

   //respContent,json格式参数;ResContentQyWap,json格式参数对应的实体类ResContentQyWap resContentQy = (ResContentQyWap)JSONUtil.JSONToObj(respContent, ResContentQyWap.class);

      实体类转换成json格式字符串:

 

 

   //bean to jsonReqContentQy reqContentQy = new ReqContentQy();//reqContentQy为实体类,可通过set等把信息放入实体类,JSONObject是net.sf.json.JSONObjectJSONObject object = JSONObject.fromObject(reqContentQy);String request=object.toString();

      2、实体类与map相互转换

      工具类:

===================2019-06-03补充,处理类型转换异常======================

/*** 将一个 Map 对象转化为一个 JavaBean* @param clazz 要转化的类型* @param map 包含属性值的 map* @return 转化出来的 JavaBean 对象* @throws IntrospectionException* @throws IllegalAccessException* @throws InstantiationException* @throws InvocationTargetException*/public static <T> T mapToBean(Class<T> clazz, Map<?, ?> map) {T obj = null;try {BeanInfo beanInfo = Introspector.getBeanInfo(clazz);obj = clazz.newInstance(); // 创建 JavaBean 对象// 给 JavaBean 对象的属性赋值PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (int i = 0; i < propertyDescriptors.length; i++) {PropertyDescriptor descriptor = propertyDescriptors[i];String propertyName = descriptor.getName();if (map.containsKey(propertyName)) {// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。Object value = map.get(propertyName);try {if ("".equals(value) || "null".equals(value)) {value = null;}Object[] args = new Object[1];args[0] = value;if((descriptor.getPropertyType().toString()).contains("Long") && args[0] != null){args[0] = Long.parseLong(args[0].toString());}if((descriptor.getPropertyType().toString()).contains("Integer") && args[0] != null){args[0] = Integer.parseInt(args[0].toString());}if((descriptor.getPropertyType().toString()).contains("Boolean") && args[0] != null){args[0] = Boolean.valueOf(args[0].toString());}if((descriptor.getPropertyType().toString()).contains("Date") && args[0] != null){try {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");args[0] = df.parse(args[0].toString());}catch (Exception e){System.out.println("日期格式转换异常e:"+e.getMessage());try {String date = args[0].toString().replace("Z", " UTC");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");args[0] = format.parse(date);}catch (Exception e1){System.out.println("日期格式转换异常e1:"+e1.getMessage());}}}descriptor.getWriteMethod().invoke(obj, args);} catch (Exception e) {System.out.println("字段映射失败:"+e.getMessage());}}}} catch (IllegalAccessException e) {System.out.println("实例化 JavaBean 失败:"+e.getMessage());} catch (IntrospectionException e) {System.out.println("分析类属性失败:"+e.getMessage());} catch (IllegalArgumentException e) {System.out.println("映射错误:"+e.getMessage());} catch (InstantiationException e) {System.out.println("实例化 JavaBean 失败:"+e.getMessage());}return (T) obj;}

=====================================================================

package com.ustcsoft.framework.util;import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;import org.apache.commons.beanutils.PropertyUtilsBean;public class MapConvertUtil {/*** 将JavaBean实体类转为map类型,然后返回一个map类型的值* @param obj,要转化的JavaBean 对象 * @return 需要返回的map*/public static Map<String, Object> beanToMap(Object obj) { Map<String, Object> params = new HashMap<String, Object>(0); try { PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(obj); for (int i = 0; i < descriptors.length; i++) { String name = descriptors[i].getName(); if (!"class".equals(name)) { if(propertyUtilsBean.getNestedProperty(obj, name) != null){params.put(name, propertyUtilsBean.getNestedProperty(obj, name));}} } } catch (Exception e) { e.printStackTrace(); } return params; }/** * 将一个 Map 对象转化为一个 JavaBean * @param clazz 要转化的类型 * @param map 包含属性值的 map * @return 转化出来的 JavaBean 对象* @throws IntrospectionException* @throws IllegalAccessException* @throws InstantiationException* @throws InvocationTargetException*/  public static <T> T mapToBean(Class<T> clazz, Map<?, ?> map) {  T obj = null;  try {  BeanInfo beanInfo = Introspector.getBeanInfo(clazz);  obj = clazz.newInstance(); // 创建 JavaBean 对象  // 给 JavaBean 对象的属性赋值  PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  for (int i = 0; i < propertyDescriptors.length; i++) {  PropertyDescriptor descriptor = propertyDescriptors[i];  String propertyName = descriptor.getName();  if (map.containsKey(propertyName)) {  // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。  Object value = map.get(propertyName);  if ("".equals(value)) {  value = null;  }  Object[] args = new Object[1];  args[0] = value;  try {  descriptor.getWriteMethod().invoke(obj, args);  } catch (InvocationTargetException e) {  System.out.println("字段映射失败");  }  }  }  } catch (IllegalAccessException e) {  System.out.println("实例化 JavaBean 失败");  } catch (IntrospectionException e) {  System.out.println("分析类属性失败");  } catch (IllegalArgumentException e) {  System.out.println("映射错误");  } catch (InstantiationException e) {  System.out.println("实例化 JavaBean 失败");  }  return (T) obj;  }
}

补充:某种情况,获取的map的key全是大写,例如jdbc查询的结果的字段都是大写,这时需要做点变动

   

/*** 某种情况,获取的map的key全是大写,例如jdbc查询的结果的字段都是大写* 重写mapToBean方法,bean属性与key比较时转化为大写* @param clazz* @param map* @param <T>* @return*/public static <T> T mapToBeanUpcase(Class<T> clazz, Map<?, ?> map) {T obj = null;try {BeanInfo beanInfo = Introspector.getBeanInfo(clazz);obj = clazz.newInstance(); // 创建 JavaBean 对象// 给 JavaBean 对象的属性赋值PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (int i = 0; i < propertyDescriptors.length; i++) {PropertyDescriptor descriptor = propertyDescriptors[i];String propertyName = descriptor.getName();if (map.containsKey(propertyName.toUpperCase())) {//// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。Object value = map.get(propertyName.toUpperCase());if ("".equals(value)) {value = null;}Object[] args = new Object[1];args[0] = value;try {descriptor.getWriteMethod().invoke(obj, args);} catch (InvocationTargetException e) {System.out.println("字段映射失败");}}}} catch (IllegalAccessException e) {System.out.println("实例化 JavaBean 失败");} catch (IntrospectionException e) {System.out.println("分析类属性失败");} catch (IllegalArgumentException e) {System.out.println("映射错误");} catch (InstantiationException e) {System.out.println("实例化 JavaBean 失败");}return (T) obj;}

 

  demo:      

 

        OnlineSigningInfo onlineSign = new OnlineSigningInfo();//onlineSign,实体类。requestMap,转化后的map格式参数Map<String, Object> requestMap = MapConvertUtil.beanToMap(onlineSign);//OnlineSigningInfo.class,要转化的类型 。requestMap,需要转换的map格式数据onlineSign= MapConvertUtil.mapToBean(OnlineSigningInfo.class, requestMap); 

       3、实体类与xml格式数据

        工具类;

 

package cn.usi.zhjt.pay.util;import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import com.sun.org.apache.xpath.internal.XPathAPI;public class XMLConverUtil {/*** 遍历list,扩展子节点* @param sb,原有stringbuffer数据* @param list,需要转换的list格式数据* @throws Exception*/public static void getStringByList(StringBuffer sb, List list)throws Exception {if (list != null && list.size() != 0) {for (Object o : list) {sb.append("<");//根据自己的需要给自己的list设立节点名称sb.append("MyList");sb.append(">");//根据list内的数据,扩展子节点getStringProperty(sb, o);sb.append("</");sb.append("MyList");sb.append(">");}}}/*** 将字段key与值value,拼接成"<key>value</key>"形式* key可为String、Integer、int,此三种类型数据形成的对象和List* @param sb* @param vo* @throws Exception*/private static void getStringProperty(StringBuffer sb, Object vo)throws Exception {for (Field field : vo.getClass().getDeclaredFields()) {field.setAccessible(true);Object obj = field.get(vo);if (obj != null) {sb.append("<");sb.append(field.getName());sb.append(">");//根据字段的数据格式类型处理数据if ("java.util.List".equals(field.getType().getName())) {//处理list类型数据,扩展子节点getStringByList(sb, (List) obj);} else if ("java.lang.String".equals(field.getType().getName())|| "java.lang.Integer".equals(field.getType().getName())|| "int".equals(field.getType().getName())) {//String、Integer包装类和int型数据,直接设值sb.append(obj);} else {getStringProperty(sb, obj);}sb.append("</");sb.append(field.getName());sb.append(">");}}}private static DocumentBuilder getDocumentBuilder()throws ParserConfigurationException {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();return dbf.newDocumentBuilder();}public static Document getDocument(InputSource inputSource)throws SAXException, IOException, ParserConfigurationException {return getDocumentBuilder().parse(inputSource);}/*** 将String类型数据转换为Document类型对象* @param text* @return* @throws SAXException* @throws IOException* @throws ParserConfigurationException*/public static Document getDOMByString(String text) throws SAXException,IOException, ParserConfigurationException {InputSource in = new InputSource(new StringReader(text));return getDocument(in);}public static Node string2Node(String xmlstr) throws SAXException,IOException, ParserConfigurationException {Document doc = string2Dom(xmlstr);return doc.getDocumentElement();}public static String dom2String(Document doc) throws IOException {doc.normalize();StringWriter wr = new StringWriter();OutputFormat of = new OutputFormat();of.setOmitXMLDeclaration(true);of.setIndenting(false);of.setPreserveSpace(true);XMLSerializer ser = new XMLSerializer(of);ser.setOutputCharStream(wr);ser.serialize(doc);return wr.toString();}public static Document string2Dom(String xml) throws SAXException,IOException, ParserConfigurationException {return getDOMByString(xml);}public static NodeList getNodes(Node doc, String xpath)throws TransformerException {return XPathAPI.selectNodeList(doc, xpath);}public static Node getSingleNode(Node doc, String xpath)throws TransformerException {return XPathAPI.selectSingleNode(doc, xpath);}public static Node createElement(Document doc, String name, String value) {Node element = doc.createElement(name);if (value != null)setNodeValue(element, value, true);return element;}public static void setNodeValue(Node node, String value)throws TransformerException {if (node == null) {return;}Node textNode = getSingleNode(node, "./text()");if (textNode != null) {textNode.setNodeValue(value);} else {textNode = node.getOwnerDocument().createTextNode(value);node.appendChild(textNode);}}public static void setNodeValue(Node node, String value, boolean replace) {if (node == null) {return;}Node textNode = node.getOwnerDocument().createTextNode(value);node.appendChild(textNode);}/*** Object转XML* xml里的根元素,根据自己的需要自己设置,编码格式也是* 子元素,从实体类里获取属性名和属性值写入* @param vo,需要转换的实体类* @return String,字符串* @throws Exception*/public static String getStringByObject(Object vo) throws Exception {StringBuffer sb = new StringBuffer();sb.append("<?xml version=\"1.0\" encoding=\"gb2312\"?>");//根据自己的需要设置根节点sb.append("<RequestContent>");getStringProperty(sb, vo);sb.append("</RequestContent>");return sb.toString();}/*** XML转Object* @param inputXML,需要转换的xml格式数据* @param object,需要转换成的实体类型* @return 返回需要格式的实体类对象* @throws Exception*/public static <T> T getObjectByString(String inputXML,Object object) throws Exception {//将String类型转换为Document类型对象Document doc = getDOMByString(inputXML);//获取第一个节点下面的所以子节点NodeList list = doc.getFirstChild().getChildNodes();Map<String, String> map = new HashMap<String, String>();//遍历节点,将Document对象转换成mapfor (int k = 0; k < list.getLength(); k++) {map.put(list.item(k).getNodeName().toUpperCase(), list.item(k).getTextContent());}for (Field field : object.getClass().getDeclaredFields()) {field.setAccessible(true);field.set(object,map.get(field.getName().toUpperCase()));}return (T)object;}}

           demo:

                ReqContent4001 reqContent4001 = new ReqContent4001();reqContent4001.setAddress("安徽合肥高新区");//通过set等设值//bean转换为xml格式数据String requestContentXml =XMLDomUtil.getStringByObject(reqContent4001);//xml格式数据转换为beanReqContent4001 result4001 = getObjectByString(requestContentXml, ReqContent4001.class);


          以上,实现了实体类与json、map、xml格式的相互转换。

 

 

 

 


 

 

 

 


 


  

这篇关于数据格式转换,数据解析,实体类、json、map、xml的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997910

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X