前面两篇已经介绍过了自定义编辑器开发和类文件的生成,今天这篇接着来介绍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