Unity 自制Json,XML解析工具DataParserTool

前段时间项目中需要一个通用的解析工具,

主要是大家之前各写各的方式,搞得很乱,然后我就写了这个小插件。

大致说下思路,一个接口,一个基类,两个子类(一个用于Json解析,一个用于XML的,好像其他不用着),一个帮助类。

主要是通过帮助类来进行解析文件的,

代码部分-----

接口:

public interface IDataParser<T>
    {
        string SerializeToObject(T _Object, System.Text.Encoding encoding);

        T DeserializeToObject(string data, System.Text.Encoding encoding);
    }

基类:

 public abstract class BaseDataParser<T> : IDataParser<T>
    {
        public abstract string SerializeToObject(T _Object, System.Text.Encoding encoding);

        public abstract T DeserializeToObject(string data, System.Text.Encoding encoding);
    }

Json类:

  public class JsonParser<T> : BaseDataParser<T> where T : class, new()
    {
        /// <summary>
        /// 序列化
        /// </summary>
        public override string SerializeToObject(T _Object, System.Text.Encoding encoding)
        {
            return encoding.GetString(encoding.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(_Object)));
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        public override T DeserializeToObject(string data, System.Text.Encoding encoding)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(encoding.GetString(encoding.GetBytes(data)));
        }
    }

XML类:

 

public class XmlParser<T> : BaseDataParser<T> where T : class, new()
    {
        /// <summary>
        /// 序列化
        /// </summary>
        public override string SerializeToObject(T _Object, System.Text.Encoding encoding)
        {
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            //Add an empty namespace and empty value
            //ns.Add("", "");
            XmlSerializer xs = new XmlSerializer(typeof(T));

            MemoryStream stream = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(stream, encoding);
            writer.Formatting = Formatting.Indented;//缩进
            xs.Serialize(writer, _Object, ns);
            stream.Position = 0;
            StringBuilder sb = new StringBuilder();
            using (StreamReader reader = new StreamReader(stream, encoding))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    sb.AppendLine(line);
                }
                reader.Close();
            }
            writer.Close();
            return sb.ToString();
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        public override T DeserializeToObject(string data, System.Text.Encoding encoding)
        {
            try
            {
                var xml = new XmlSerializer(typeof(T));
                using (var ms = new MemoryStream(encoding.GetBytes(data)))
                {
                    using (var sr = new StreamReader(ms, encoding))
                    {
                        return (T)xml.Deserialize(sr);
                    }
                }
            }
            catch (System.Exception e)
            {
                UnityEngine.Debug.Log(e.Message);
                return default(T);
            }
        }
    }

帮助类:

 public static class DataHelper
    {
        /// <summary>
        /// 序列化  默认格式UTF8
        /// </summary>
        public static string SerializeToObject<T>(this T _Object, Parser.IDataParser<T> dataParser) where T : class, new()
        {
            return dataParser.SerializeToObject(_Object, System.Text.Encoding.UTF8);
        }

        /// <summary>
        /// 序列化   encoding 编码格式
        /// </summary>
        public static string SerializeToObject<T>(this T _Object, System.Text.Encoding encoding, Parser.IDataParser<T> dataParser) where T : class, new()
        {
            return dataParser.SerializeToObject(_Object, encoding);
        }

        /// <summary>
        /// 根据指定路径 解析到指定文本中  encoding 编码格式
        /// </summary>
        public static void SerializeToObject<T>(this T _Object, System.Text.Encoding encoding, string path, Parser.IDataParser<T> dataParser) where T : class, new()
        {
            if (File.Exists(path))
            {
                using (StreamWriter sw = new StreamWriter(path, false))
                {
                    sw.Write(encoding.GetString(encoding.GetBytes(dataParser.SerializeToObject(_Object, encoding))));
                }
                UnityEngine.Debug.Log("该文件存在,进行覆盖");
            }
            else
            {
                UnityEngine.Debug.Log("该文件不存在存在,进行新建");
                string content = encoding.GetString(encoding.GetBytes(dataParser.SerializeToObject(_Object, encoding)));
                File.WriteAllText(path, content, encoding);
            }
        }

        /// <summary>
        /// 反序列化  默认文本格式
        /// </summary>
        public static T DeserializeToObject<T>(this string path, Parser.IDataParser<T> dataParser) where T : class, new()
        {
            return DeserializeToObject(path, System.Text.Encoding.UTF8, dataParser);
        }

        /// <summary>
        /// 根据路径 解析文本  encoding 编码格式
        /// </summary>
        public static T DeserializeToObject<T>(this string path, System.Text.Encoding encoding, Parser.IDataParser<T> dataParser) where T : class, new()
        {
            if (File.Exists(path))
            {
                StreamReader sr = new StreamReader(path, encoding);
                string data = sr.ReadToEnd();
                sr.Dispose();
                return dataParser.DeserializeToObject(data, encoding);
            }
            else
            {
                UnityEngine.Debug.Log(path + "  该路径不合法");
            }
            return default(T);
        }
    }

写个测试类:

JSon测试类:

using System.Collections.Generic;
using UnityEngine;
using Sandboxie.Data;
using Sandboxie.Data.Parser;
using System.Text;

public class JsonToolTest : MonoBehaviour {
    private string path = "";
	// Use this for initialization
	void Start () {
        /***     序列化               ****/
        path = Application.streamingAssetsPath + "/JsonTool" + "/aaa.json";

        List<Children> childrens = new List<Children>()
        {
            new Children(){name="张三",sex="女",age="22" },
             new Children(){name="李四",sex="男",age="33" },
              new Children(){name="齐5",sex="女",age="15" },
               new Children(){name="李6",sex="女",age="8" },
        };

        childrens.SerializeToObject(Encoding.UTF8, path, new JsonParser<List<Children>>());


        /*****  反序列化  ******/

     var  mylist=  path.DeserializeToObject(Encoding.UTF8, new JsonParser<List<Children>>());

        foreach (var m in mylist)
        {
            Debug.Log(m.name+":"+m.sex+":"+m.age);
        }
    }

}
public class Children
{
    public string name;
    public string sex;
    public string age;
}

输出结果:

 

同理,把JsonParser换成 XMLParser 就变成了XML工具了。

值得注意的点:

1、路径命名 , 如下

 path = Application.streamingAssetsPath + "/JsonTool" + "/aaa.json";

如果你用的是XML,--->aaa.xml;同理json---->aaa.json

2,关于编码类型

我这里用的UTF8,也是默认的,当然你也可以改成其他的。

工具连接地址:https://download.csdn.net/download/qq_40120946/10916224

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值