Unity中 XML转Json

第一次写博客这东西,总觉得记忆这东西不可靠,所以还是记录下。

项目里用的是xml,听说Json用的人很多,所以想试一下Json.就在网上找了很多资料,整理了一下。将项目里的xml文件转换为json文件。

ps:用到的资源都是网上找的,如果侵犯了原作者的利益,请联系本人。

1.需求: 

网上Json的类别很多,MiniJson ,LitJson,DeJson的,这些东西以前都没涉及过,这次算都看了一遍,会不会就不管了。 这里我用的是Newtonsoft.Json.dll 网上也能下载到。要是觉得和System.Data一起找麻烦,这里分享一下:http://pan.baidu.com/s/1hsLPiVM

2.废话不多说上代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Newtonsoft.Json;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System;
using System.Xml;
public class JsonUtility
{
    private DataSet mResultSet;

    public JsonUtility(string jsonFile)
    {
        FileStream mStream = File.Open(jsonFile, FileMode.Open, FileAccess.Read);
        mResultSet = new DataSet();
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(mStream);
        XmlNodeReader reader = new XmlNodeReader(xmldoc);
        mResultSet.ReadXml(reader);
        reader.Close();
    }

    /// <summary>
    /// 转换为Json
    /// </summary>
    /// <param name="JsonPath">Json文件路径</param>
    /// <param name="Header">表头行数</param>
    public void ConvertToJson(string JsonPath, Encoding encoding)
    {
        //判断XML文件中是否存在数据表
        if (mResultSet.Tables.Count < 1)
            return;

        //默认读取第一个数据表
        DataTable mSheet = mResultSet.Tables[0];

        //判断数据表内是否存在数据
        if (mSheet.Rows.Count < 1)
            return;

        //读取数据表行数和列数
        int rowCount = mSheet.Rows.Count;
        int colCount = mSheet.Columns.Count;

        Debug.Log("row:" + rowCount.ToString() + "/col:" + colCount.ToString());

        //准备一个列表存储整个表的数据
        List<Dictionary<string, object>> table = new List<Dictionary<string, object>>();

        //读取数据
        for (int i = 0; i < rowCount; i++)
        {
            //准备一个字典存储每一行的数据
            Dictionary<string, object> row = new Dictionary<string, object>();
            for (int j = 0; j < colCount; j++)
            {
                //读取第1行数据作为表头字段
                string field = mSheet.Columns[j].ToString();
                //Key-Value对应
                row[field] = mSheet.Rows[i][j];
            }

            //添加到表数据中
            table.Add(row);
        }

        //生成Json字符串
        string json = JsonConvert.SerializeObject(table, Newtonsoft.Json.Formatting.Indented);
        //写入文件
        using (FileStream fileStream = new FileStream(JsonPath, FileMode.Create, FileAccess.Write))
        {
            using (TextWriter textWriter = new StreamWriter(fileStream, encoding))
            {
                textWriter.Write(json);
            }
        }
    }
}

  3.再来个Unity Windons编辑窗口脚本

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Text;

public class JsonTools : EditorWindow
{
    /// <summary>
    /// 当前编辑器窗口实例
    /// </summary>
    private static JsonTools instance;

    /// <summary>
    /// xml文件列表
    /// </summary>
    private static List<string> xmlList;

    /// <summary>
    /// 项目根路径	
    /// </summary>
    private static string pathRoot;

    /// <summary>
    /// 滚动窗口初始位置
    /// </summary>
    private static Vector2 scrollPos;

    /// <summary>
    /// 输出格式索引
    /// </summary>
    private static int indexOfFormat = 0;

    /// <summary>
    /// 输出格式
    /// </summary>
    private static string[] formatOption = new string[] { "JSON"};


    /// <summary>
    /// 编码索引
    /// </summary>
    private static int indexOfEncoding = 0;

    /// <summary>
    /// 编码选项
    /// </summary>
    private static string[] encodingOption = new string[] { "UTF-8", "GB2312" };

    /// <summary>
    /// 是否保留原始文件
    /// </summary>
    private static bool keepSource = true;

    /// <summary>
    /// 显示当前窗口	
    /// </summary>
    [MenuItem("Plugins/JsonTools")]
    static void ShowXMLTools()
    {
        Init();
        //加载XML文件
        LoadXML();
        instance.Show();
    }

    void OnGUI()
    {
        DrawOptions();
        DrawExport();
    }

    /// <summary>
    /// 绘制插件界面配置项
    /// </summary>
    private void DrawOptions()
    {
        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("请选择格式类型:", GUILayout.Width(85));
        indexOfFormat = EditorGUILayout.Popup(indexOfFormat, formatOption, GUILayout.Width(125));
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("请选择编码类型:", GUILayout.Width(85));
        indexOfEncoding = EditorGUILayout.Popup(indexOfEncoding, encodingOption, GUILayout.Width(125));
        GUILayout.EndHorizontal();

        keepSource = GUILayout.Toggle(keepSource, "保留XML源文件");
    }

    /// <summary>
    /// 绘制插件界面输出项
    /// </summary>
    private void DrawExport()
    {
        if (xmlList == null) return;
        if (xmlList.Count < 1)
        {
            EditorGUILayout.LabelField("目前没有XML文件被选中哦!");
        }
        else
        {
            EditorGUILayout.LabelField("下列项目将被转换为" + formatOption[indexOfFormat] + ":");
            GUILayout.BeginVertical();
            scrollPos = GUILayout.BeginScrollView(scrollPos, false, true, GUILayout.Height(150));
            foreach (string s in xmlList)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Toggle(true, s);
                GUILayout.EndHorizontal();
            }
            GUILayout.EndScrollView();
            GUILayout.EndVertical();

            //输出
            if (GUILayout.Button("转换"))
            {
                Convert();
            }
        }
    }

    /// <summary>
    /// 转换XML文件
    /// </summary>
    private static void Convert()
    {
        foreach (string assetsPath in xmlList)
        {
            //获取xml文件的绝对路径
            string xmlPath = pathRoot + "/" + assetsPath;
            //构造XML工具类
            JsonUtility xml = new JsonUtility(xmlPath);

            //判断编码类型
            Encoding encoding = null;
            if (indexOfEncoding == 0 || indexOfEncoding == 3)
            {
                encoding = Encoding.GetEncoding("utf-8");
            }
            else if (indexOfEncoding == 1)
            {
                encoding = Encoding.GetEncoding("gb2312");
            }

            //判断输出类型
            string output = "";
            if (indexOfFormat == 0)
            {
                output = xmlPath.Replace(".xml", ".json");
                xml.ConvertToJson(output, encoding);
            }

            //判断是否保留源文件
            if (!keepSource)
            {
                FileUtil.DeleteFileOrDirectory(xmlPath);
            }

            //刷新本地资源
            AssetDatabase.Refresh();
        }

        //转换完后关闭插件
        //这样做是为了解决窗口
        //再次点击时路径错误的Bug
        instance.Close();

    }

    /// <summary>
    /// 加载XML
    /// </summary>
    private static void LoadXML()
    {
        if (xmlList == null) xmlList = new List<string>();
        xmlList.Clear();
        //获取选中的对象
        object[] selection = (object[])Selection.objects;
        //判断是否有对象被选中
        if (selection.Length == 0)
            return;
        //遍历每一个对象判断不是XML文件
        foreach (Object obj in selection)
        {
            string objPath = AssetDatabase.GetAssetPath(obj);
            if (objPath.EndsWith(".xml"))
            {
                xmlList.Add(objPath);
            }
        }
    }

    private static void Init()
    {
        //获取当前实例
        instance = EditorWindow.GetWindow<JsonTools>();
        //初始化
        pathRoot = Application.dataPath;
        //注意这里需要对路径进行处理
        //目的是去除Assets这部分字符以获取项目目录
        //我表示Windows的/符号一直没有搞懂
        pathRoot = pathRoot.Substring(0, pathRoot.LastIndexOf("/"));
        xmlList = new List<string>();
        scrollPos = new Vector2(instance.position.x, instance.position.y + 75);
    }

    void OnSelectionChange()
    {
        //当选择发生变化时重绘窗体
        Show();
        LoadXML();
        Repaint();
    }
}

  4.这两个脚本都放在Unity项目的Editor文件路径下。

这是Unity的菜单栏会出现一个

 

5.打开JosnTools窗口在project里选择要转换的xml文件,支持多选。

点击转换按钮 就完成了xml 到 json文件的转换了。

提示提示,由于xml文件的不同,对应的层数也不一样所以转换的json文件可能会数据不匹配。这时可能就要改代码了:

在 JsonUtility.cs 脚本里ConvertToJson方法里 表头字段 和 value值 根据xml对应匹配一下。

至于Json数据的读取,再研究这个转换的时候,看到网上好多教程,就不多说了。

哈哈~写完了,比作文简单。

 

posted @ 2016-08-10 16:23  zoqiushui  阅读(1096)  评论(0)    收藏  举报