【Unity知识点详解】导表工具开发(三)—— Json文件生成

前面两篇已经介绍过了自定义编辑器开发和类文件的生成,今天这篇接着来介绍Json文件的生成。

这里用到的Json第三方插件是Json.Net,本文后面的代码示例都是针对Json.Net的,Json.Net的官网和文档在文章最后,需要的小伙伴可以自行查阅。使用其他第三方插件的小伙伴也可以在理解原理之后举一反三,根据自己使用的插件生成Json文件,话不多说直接开始了。

using System.IO;
using System.Text;
using UnityEngine;
using Editor.Define;
using Excel;
using Newtonsoft.Json;

namespace Editor.Config
{
    public class ConfigJsonGenerator
    {
        private string className;
        private string[] types;
        private string[] fields;
        private string[] datas;

        private StringBuilder stringBuilder;
        private JsonTextWriter jsonTextWriter;

        public ConfigJsonGenerator()
        {
            stringBuilder = new StringBuilder();
            StringWriter stringWriter = new StringWriter(stringBuilder);
            jsonTextWriter = new JsonTextWriter(stringWriter);
            jsonTextWriter.Formatting = Formatting.Indented;
        }
    }
}

先来介绍类的成员变量和构造初始化,看过上一篇《类文件生成》的小伙伴对这些成员变量应该比较熟悉。types、fields、datas分别是用来保存类型、字段名、数据。stringBuilder则是用来保存Json字符串,最后用于导出Json文件。这里的重点是jsonTextWriter,由Json.Net提供用于Json生成。

/// <summary>生成Json</summary>
/// <param name="config">配置</param>
/// <param name="exportPath">导出路径</param>
public void GenerateJson(string configPath, string exportPath)
{
    if(File.Exists(configPath))
    {
        GenerateJsonCode(configPath);
        ExportFile(exportPath);
    }
    else
    {
        Debug.LogError(string.Format("Generate config error, Config is not exist. config path is {0}.", configPath));
    }
}

/// <summary>生成Json代码</summary>
/// <param name="configPath">配置路径</param>
private void GenerateJsonCode(string configPath)
{
    FileStream stream = File.OpenRead(configPath);
    IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    className = excelReader.Name;

    while(excelReader.Read())
    {
        if(excelReader.Depth == (int)EnumConfigFormat.Type)
        {
            WriteStart(excelReader);
            types = GetDatas(excelReader);
        }
        else if(excelReader.Depth == (int)EnumConfigFormat.Field)
        {
            fields = GetDatas(excelReader);
        }
        else if(excelReader.Depth >= (int)EnumConfigFormat.Data)
        {
            datas = GetDatas(excelReader);
            AppendJson(types, fields, datas);
        }
    }

    jsonTextWriter.WriteEnd();
    excelReader.Close();
}

/// <summary>写入开始</summary>
/// <param name="excelReader">excelReader</param>
private void WriteStart(IExcelDataReader excelReader)
{
    if(excelReader.Depth == (int)EnumConfigFormat.Type)
    {
        string type = excelReader.GetString(0);
        if(type == "int")
            jsonTextWriter.WriteStartArray();
        else if(type == "string")
            jsonTextWriter.WriteStartObject();
    }
}

/// <summary>获取数据</summary>
/// <param name="excelReader">excelReader</param>
/// <returns></returns>
private string[] GetDatas(IExcelDataReader excelReader)
{
    string[] datas = new string[excelReader.FieldCount];
    for(int i = 0; i < excelReader.FieldCount; i++)
    {
        datas[i] = excelReader.GetString(i);
    }

    return datas;
}

/// <summary>添加Json</summary>
/// <param name="types">类型</param>
/// <param name="fields">字段名</param>
/// <param name="datas">数据</param>
private void AppendJson(string[] types, string[] fields, string[] datas)
{
    if(types[0] == "string")
        jsonTextWriter.WritePropertyName(datas[0]);

    jsonTextWriter.WriteStartObject();
    for(int i = 0; i < types.Length; i++)
    {
        switch(types[i])
        {
            case "string":
                AppendString(fields[i], datas[i]);
                break;
            case "int":
                AppendInt(fields[i], datas[i]);
                break;
        }
    }
    jsonTextWriter.WriteEndObject();
}

/// <summary>添加string</summary>
/// <param name="field"></param>
/// <param name="data"></param>
private void AppendString(string field, string data)
{
    jsonTextWriter.WritePropertyName(field);
    jsonTextWriter.WriteValue(data);
}

/// <summary>添加int</summary>
/// <param name="field"></param>
/// <param name="data"></param>
private void AppendInt(string field, string data)
{
    jsonTextWriter.WritePropertyName(field);
    jsonTextWriter.WriteValue(int.Parse(data));
}

上面的示例有些多,我们直接从GenerateJsonCode方法开始讲,GenerateJsonCode方法主要逻辑还是读取Excel文件,并通过循环的方式获取到Excel配表中的数据。WriteStart方法则是通过判断类型字段第一个元素是int类型还是string类型,决定将Json编写成Array或Object。

在GenerateJsonCode方法中获取到types、fields、datas这些数据之后,接下来在AppendJson方法中就是通过jsonTextWriter编辑Json。接下来就介绍一下JsonTextWriter类中提供的一些方法接口。

  • WriteStartArray、WriteEndArray  写入Json的数组开头,写入Json的数组结尾,两个方法需要配合使用。
  • WriteStartObject、WriteEndObject  写入Json的对象开头,写入Json的对象结尾,两个方法需要配合使用。
  • WriteEnd  写入当前Json的数组或对象结尾。
  • WritePropertyName 写入Json的参数名
  • WriteValue 写入一个值

上面这些就是示例代码中编写Json用到的一些方法接口,示例中只展示了写入int和string两种类型。关于JsonTextWriter类的接口可以自行查阅文档。

/// <summary>输出文件</summary>
private void ExportFile(string exportPath)
{
    string path = string.Format("{0}/{1}.json", exportPath, className);
    string content = stringBuilder.ToString();
    File.WriteAllText(path, content);

    Debug.Log(string.Format("Config generate json-file complete. File name is {0}.json", className));
}

最后一步就是生成 .json文件了,并将Json文件保存到输出路径。到此就大功告成了,文章的最后是连接地址,有需要的小伙伴可以自行查阅。

 

Json.Net官网  https://www.newtonsoft.com/json

Json.Net文档 https://www.newtonsoft.com/json/help/html/Introduction.htm

 

 

猜你喜欢

转载自blog.csdn.net/huoyixian/article/details/104785904
今日推荐