Unity数据解析(Json、XML、CSV、二进制)

注释

常见的数据解析(Json、XML、CSV、二进制)

using System;
using System.IO;
using System.Xml.Serialization;
using Newtonsoft.Json;
using System.Runtime.InteropServices;
using System.Text;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;/// <summary>
/// 数据解析(Json、XML、CSV、二进制)
/// </summary>
public class AnalyticData
{#region Json/// <summary>/// Json序列化接口/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="dataClass">序列化对象</param>/// <returns></returns>public static string JsonSerialization<T>(T dataClass) where T : class{string jsonStr = JsonConvert.SerializeObject(dataClass);return jsonStr;}/// <summary>/// Json反序列化接口/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="path">文件路径</param>/// <returns></returns>public static T JsonRead<T>(string path) where T : class{T Data;StreamReader sr = new StreamReader(path);string jsonStr = sr.ReadToEnd();//反序列化Data = JsonConvert.DeserializeObject<T>(jsonStr);return Data;}/// <summary>/// Json反序列化接口(数组类型)/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="path">文件路径</param>/// <returns></returns>public static T[] JsonArrayRead<T>(string path) where T : class{T[] DataArray;StreamReader sr = new StreamReader(path);string jsonStr = sr.ReadToEnd();//反序列化DataArray = JsonConvert.DeserializeObject<T[]>(jsonStr);return DataArray;}/// <summary>/// Json反序列化接口/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="str">需解析字符串</param>/// <returns></returns>public static T JsonByStringRead<T>(string str) where T : class{T Data;//反序列化Data = JsonConvert.DeserializeObject<T>(str);return Data;}#endregion#region XML/// <summary>/// XML序列化接口/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="dataClass">序列化对象</param>/// <returns></returns>public static string XMLSerialization<T>(T dataClass) where T : class{using (StringWriter sw = new StringWriter()){//此处T必须是Public类型Type t = dataClass.GetType();XmlSerializer serializer = new XmlSerializer(dataClass.GetType());serializer.Serialize(sw, dataClass);sw.Close();return sw.ToString();}}/// <summary>/// XML序列化接口(元素值序列化为单引号格式)/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="dataClass">序列化对象</param>/// <returns></returns>public static string XMLToSingleQuotationMarkSerialization<T>(T dataClass) where T : class{using (StringWriter sw = new StringWriter()){//此处T类必须是Public类型Type t = dataClass.GetType();XmlSerializer serializer = new XmlSerializer(dataClass.GetType());serializer.Serialize(sw, dataClass);sw.Close();string dataStr = sw.ToString();string newDataStr = dataStr.Replace("\"", "'");   //将双引号转换为单引号,方便部分引擎解析return newDataStr;}}//转义字符:(当属性值中含特殊字符时,为避免解析出错,需使用转义字符)//1、 &lt;      <      小于号 //2、 &gt;      >      大于号//3、 &amp;     &      和//4、 &apos;    '      单引号//5、 &quot;    "      双引号//6、 &lt;=     <=     小于等于//7、 &gt;=     >=     大于等于/// <summary>/// XML反序列化接口/// </summary>/// <typeparam name="T">泛型类</typeparam>/// <param name="path">文件路径</param>/// <returns></returns>public static T XMLRead<T>(string path) where T : class{StreamReader sReader = new StreamReader(path);string xmlStr = sReader.ReadToEnd();try{using (StringReader sr = new StringReader(xmlStr)){XmlSerializer serializer = new XmlSerializer(typeof(T));return serializer.Deserialize(sr) as T;}}catch (Exception){return null;}}#endregion#region CSVprivate static char _csvSeparator = ',';private static bool _trimColumns = false;//解析一行private static List<string> ParseLine(string line){StringBuilder _columnBuilder = new StringBuilder();List<string> Fields = new List<string>();bool inColum = false; //是否是在一个列元素里bool inQuotes = false; //是否需要转义bool isNotEnd = false; //读取完毕未结束转义_columnBuilder.Remove(0, _columnBuilder.Length);//空行也是一个空元素,一个逗号是2个空元素if (line == ""){Fields.Add("");}// Iterate through every character in the line  遍历行中的每个字符for (int i = 0; i < line.Length; i++){char character = line[i];//If we are not currently inside a column   如果我们现在不在一列中if (!inColum){// If the current character is a double quote then the column value is contained within//如果当前字符是双引号,则列值包含在内// double quotes, otherwise append the next character//双引号,否则追加下一个字符inColum = true;if (character == '"'){inQuotes = true;continue;}}// If we are in between double quotes   如果我们处在双引号之间if (inQuotes){if ((i + 1) == line.Length) //这个字符已经结束了整行{if (character == '"') //正常转义结束,且该行已经结束{inQuotes = false;continue;}else //异常结束,转义未收尾{isNotEnd = true;}}else if (character == '"' && line[i + 1] == _csvSeparator) //结束转义,且后面有可能还有数据{inQuotes = false;inColum = false;i++; //跳过下一个字符}else if (character == '"' && line[i + 1] == '"') //双引号转义{i++; //跳过下一个字符}else if (character == '"') //双引号单独出现(这种情况实际上已经是格式错误,为了兼容暂时不处理){throw new System.Exception("格式错误,错误的双引号转义");}//其他情况直接跳出,后面正常添加}else if (character == _csvSeparator){inColum = false;}// If we are no longer in the column clear the builder and add the columns to the list///   结束该元素时inColumn置为false,并且不处理当前字符,直接进行Addif (!inColum){Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());_columnBuilder.Remove(0, _columnBuilder.Length);}else //追加当前列{_columnBuilder.Append(character);}}// If we are still inside a column add a new one (标准格式一行结尾不需要逗号结尾,而上面for是遇到逗号才添加的,为了兼容最后还要添加一次)if (inColum){if (isNotEnd){_columnBuilder.Append("\r\n");}Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());}else //如果inColumn为false,说明已经添加,因为最后一个字符为分隔符,所以后面要加上一个空元素{Fields.Add("");}return Fields;}/// <summary>/// 读取CSV文件/// </summary>/// <param name="filePath"></param>/// <param name="encoding"></param>/// <returns></returns>public static List<List<string>> CSVRead(string filePath, Encoding encoding){List<List<string>> result = new List<List<string>>();string content = File.ReadAllText(filePath, encoding); //读取所有的文本内容string[] lines = content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//以换行回车拆分字符串,去除空格//注:回车换行可能对某些文本不适用,这里如果我们出现读取不正常,可以改用 \n (换行)试试for (int i = 0; i < lines.Length; i++){List<string> line = ParseLine(lines[i]);result.Add(line);}return result;}/// <summary>/// 生成CSV文件/// </summary>/// <typeparam name="T"></typeparam>/// <param name="dataList">对象集合</param>/// <param name="filePath">文件存储路径</param>/// <returns></returns>public static bool CSVFileSaveData<T>(List<T> dataList, string filePath) where T : class{bool successFlag = true;//所有文本StringBuilder sb_Text = new StringBuilder();//第一行属性文本StringBuilder strColumn = new StringBuilder();//其他行属性值文本StringBuilder strValue = new StringBuilder();StreamWriter sw = null;var tp = typeof(T);//获取当前Type的所有公共属性                   BindingFlags指定反射查找的范围PropertyInfo[] props = tp.GetProperties(BindingFlags.Public | BindingFlags.Instance);try{//获取第一行属性文本for (int i = 0; i < props.Length; i++){var itemPropery = props[i];//检索自定义特性信息AttrForCsvColumnLabel labelAttr = itemPropery.GetCustomAttributes(typeof(AttrForCsvColumnLabel), true).FirstOrDefault() as AttrForCsvColumnLabel;if (labelAttr != null){strColumn.Append(labelAttr.Title);}else{strColumn.Append(props[i].Name);}strColumn.Append(",");}//移除最后一个","strColumn.Remove(strColumn.Length - 1, 1);sb_Text.AppendLine(strColumn.ToString());//依次遍历数据列表,得到其他行属性值文本for (int i = 0; i < dataList.Count; i++){var model = dataList[i];strValue.Clear();//获取每一组数据中对应的属性值for (int m = 0; m < props.Length; m++){var itemProoery = props[m];var val = itemProoery.GetValue(model, null);if (m == 0){strValue.Append(val);}else{strValue.Append(",");strValue.Append(val);}}sb_Text.AppendLine(strValue.ToString());}}catch (System.Exception){successFlag = false;}finally{if (sw != null){sw.Dispose();}}File.WriteAllText(filePath, sb_Text.ToString(), Encoding.Default);return successFlag;}public static void CsvWrite(List<List<string>> datas, string path){//所有文本StringBuilder sb_Text = new StringBuilder();for (int i = 0; i < datas.Count; i++){for (int j = 0; j < datas[i].Count; j++){sb_Text.Append(datas[i][j] + ",");}sb_Text.AppendLine();}File.WriteAllText(path, sb_Text.ToString(), Encoding.Default);}#endregion#region 结构体二进制/// <summary>/// 结构体转换为二进制数组/// </summary>/// <param name="structObj">结构体</param>/// <returns>转换后的二进制数组</returns>public static byte[] StructToBytesFunc(object structObj){//得到结构体的大小int size = Marshal.SizeOf(structObj);//创建byte数组byte[] bytes = new byte[size];//分配结构体大小的内存空间IntPtr structPtr = Marshal.AllocHGlobal(size);//将结构体拷贝到分配的内存空间Marshal.StructureToPtr(structObj, structPtr, false);//从内存空间拷贝到byte数组Marshal.Copy(structPtr, bytes, 0, size);//释放内存空间Marshal.FreeHGlobal(structPtr);//返回byte数组return bytes;}/// <summary>/// byte数组转结构/// </summary>/// <param name="bytes">byte数组</param>/// <param name="type">结构类型</param>/// <returns>转换后的结构</returns>public static object BytesToStructFunc(byte[] bytes, Type type){int size = Marshal.SizeOf(type);//byte数组长度小于结构的大小if (size > bytes.Length){//返回空return null;}//分配结构大小的内存空间IntPtr structPtr = Marshal.AllocHGlobal(size);//将byte数组拷贝到分配好的内存空间Marshal.Copy(bytes, 0, structPtr, size);//将内存空间转换为目标结构object obj = Marshal.PtrToStructure(structPtr, type);//释放内存空间Marshal.FreeHGlobal(structPtr);//返回结构return obj;}#endregion
}public class AttrForCsvColumnLabel : Attribute
{public string Title { get; set; }
}

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

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

相关文章

猜数字游戏(扩展)

游戏要求&#xff1a; 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤⼩给出⼤了或⼩了的反馈&#xff0c;直到猜对&#xff0c;游戏结束 1. 随机数⽣成 1.1 rand C语⾔提供了⼀个函数叫 rand&#xff0c;这函数是可…

86.网游逆向分析与插件开发-物品使用-物品丢弃的逆向分析与C++代码的封装

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;物品使用的逆向分析与C代码的封装-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;7563f86877c…

NFTScan 与 Merlin Protocol 共同推出 BRC20 Indexer Oracle,于今日正式上线!

近日&#xff0c;NFT 数据基础设施 NFTScan 与 Merlin Protocol 进行战略合作&#xff0c;联合推出了比特币网络原生资产 Indexer Oracle 服务&#xff0c;现在该服务已在 NFTScan 开发者平台上线&#xff0c;任何开发者都可以注册使用&#xff01; Merlin Protocol 是一个专用…

linux 磁盘标签类型MBR转换为GPT

[rootlocalhost /]# fdisk -l 磁盘 /dev/sda&#xff1a;299.4 GB, 299439751168 字节&#xff0c;584843264 个扇区 Units 扇区 of 1 * 512 512 bytes 扇区大小(逻辑/物理)&#xff1a;512 字节 / 512 字节 I/O 大小(最小/最佳)&#xff1a;512 字节 / 512 字节 磁盘标签类…

解读 HTTP 和 HTTPS:有何异同?

超文本传输安全协议&#xff08;HTTPS&#xff09;是建立在超文本传输协议&#xff08;HTTP&#xff09;之上的一种安全网络传输协议。在计算机网络上传输时&#xff0c;HTTPS 通过传输层安全性&#xff08;TLS&#xff09;或它的前身安全套接字层&#xff08;SSL&#xff09;为…

谷歌上架防关联VPS开到和原来一样的IP造成关联?应该怎么选?

随着Google paly的发展&#xff0c;竞争越来越激烈&#xff0c;开发者们也面临的越来越多的挑战。其中&#xff0c;如何降低关联风险是开发者们重点关注的问题。 为了防止开发者账号的滥用或欺诈&#xff0c;谷歌会通过判断账号之间是否存在关联&#xff0c;并对违规账号进行处…

Unity打开文件,文件夹

注释 unity打开文件文件夹的方法 using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine;public class FilePathHelper {private static string filePath;/// <summary>/// 选择文件路…

【Vue】二、Vue 组件展示控制的优雅解决方案

vue项目中展示的组件&#xff0c;我平常都是通过v-show进行展示控制&#xff0c;类似这样 通常情况下&#xff0c;一个正常展示组件的流程&#xff0c;是通过前端用户点击触发函数&#xff0c;在函数中对data数据进行操作&#xff0c;从而展示不同的页面 showWork: false, sho…

首次接触共享办公室,有哪些问题需要注意?

随着互联网和创业的发展&#xff0c;越来越多的企业和个人选择共享办公空间作为他们的办公场所。共享办公空间是一种提供灵活的办公模式和配套的设施和服务的空间&#xff0c;可以帮助企业和个人节省成本和空间&#xff0c;提高效率和创新&#xff0c;拓展人脉和资源。但是&…

【C++】STL之空间配置器(了解)

一、什么是空间配置器 空间配置器 &#xff0c;顾名思义就是为各个容器高效的管理空间&#xff08;空间的申请与回收&#xff09;的&#xff0c;在默默地工作。虽然在常规使用 STL 时&#xff0c;可能用不到它&#xff0c;但站在学习研究的角度&#xff0c;学习它的实现原理对…

注册亚马逊店铺用动态IP可以吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。 固定ip可以给我们的账户带来更多的安全&#xff0c;要知道关联问题是亚马逊上的一个大问题&#…

PHP/原生类/Java/Python反序列化总结

PHP反序列化 #方法&属性-调用详解&变量数据详解 对象变量属性&#xff1a; public(公共的):在本类内部、外部类、子类都可以访问 protect(受保护的):只有本类或子类或父类中可以访问 private(私人的):只有本类内部可以使用 序列化数据显示&#xff1a; private 属性序…

Javascript(运算符与表达式、控制语句)

一、运算符与表达式 - * / % ** - * / % ** -- 位运算、移位运算 ! > > < < ! ⭐️ && || ! ⭐️ ?? ?. ⭐️ ... ⭐️ 解构赋值 ⭐️ 1) 严格相等运算符&#xff0c;用作逻辑判等 1 1 // 返回 true 1 1 // 返回 true&#xf…

算法训练 day32 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接:买卖股票的最佳时机 II 如果想到其实最终利润是可以分解的&#xff0c;那么本题就很容易了&#xff01;其实就是把利润分解为以每天为一个维度&#xff0c;我们可以只收集正利润的区间&#xff0c;获取正利润的区间就是股票买卖的区间&…

python 防止sql注入

python 防止sql注入 在Python中防止SQL注入有以下几种实现方法&#xff1a; 1、使用参数化查询&#xff08;Prepared Statements&#xff09;&#xff1a;这是最常用和推荐的方法。使用参数化查询可以将用户输入的数据与SQL语句进行分离&#xff0c;从而避免将用户输入内容作…

关于我用AI编写了一个聊天机器人……(8)

本次更新为1.3.4版本&#xff0c;增加了关机&#xff0c;重启&#xff0c;取消关机/重启的功能。 代码如下&#xff1a; #include <bits/stdc.h> #include <ctime> using namespace std; string userInput; class VirtualRobot { public:void chat() {cout <…

java安装与入门,MySQL安装与入门,Linux安装与入门,git安装与入门

一.java安装与入门 1,安装idea 2.快捷方式 3.Java入门基础 4.常见的API&#xff08;非常全面&#xff09; 链接&#xff1a;java后端__阿伟_的博客-CSDN博客 二.MySQL安装与入门 1.MySQL安装 2.MySQL入门 链接&#xff1a;数据库入门(MySQL&#xff0c;Redis )__阿伟_的…

python爬虫之豆瓣首页图片爬取

网址&#xff1a;https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

Spring Cloud使用笔记

1.无需下载nacos&#xff0c;直接在项目中启动即可 git clone https://gitee.com/a594281060/base-nacos.git

如何快速知道app当前页面是哪一个Activity(2.0升级版)

点我跳转 如何快速知道app当前页面是哪一个Activity 1.0版本 这个版本是用adb 命令实现的&#xff0c;想看的可以看看&#xff0c;学习一下adb 命令。 今天做了一个非常简易的app来直接监控当前页面Activity&#xff0c;效果直接炸裂&#xff0c;效果图如下&#xff1a; 有需要…