Unity Json实体类快速生成保存工具

2024-08-29 05:12

本文主要是介绍Unity Json实体类快速生成保存工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity Json实体类快速生成保存工具

前提:Newtonsoft.Json
拖文件夹那边用的是odin,直接手打存储文件夹地址。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;public class JosnEditor : OdinEditorWindow
{[TextArea(2, 20), HideLabel, Title("json", TitleAlignment = TitleAlignments.Centered)]public string json;[MenuItem("Tools/Json工具")]private static void Open(){GetWindow<JosnEditor>().Show();}[LabelText("生成的实体类名前缀[遵循类名规则]")]public string classHead;[LabelText("命名空间")]public string nameSpace = "";[LabelText("region注释")]public string regionName = "json数据实体类";[TextArea(2, 20), HideLabel, Title("生成的C#实体类", TitleAlignment = TitleAlignments.Centered)]public string result;[Button("生成")]private void Generate(){var obj = JsonConvert.DeserializeObject<JObject>(json);var sb = new StringBuilder();sb.AppendLine("using System.Collections;");sb.AppendLine("using System.Collections.Generic;");sb.AppendLine("using UnityEngine;");sb.AppendLine("");sb.AppendLine("/*通过JosnEditor.cs 脚本自动生成...*/");if (!string.IsNullOrEmpty(nameSpace)){sb.AppendLine($"namespace {nameSpace} ");sb.AppendLine("{");}sb.AppendLine($"#region {regionName}");Parse(obj, sb);sb.AppendLine("#endregion");if (!string.IsNullOrEmpty(nameSpace))sb.AppendLine("}");result = sb.ToString();GenerateLog = DateTime.Now + " Generate";}[Button("保存")]private void Save(){if (!Directory.Exists(SavePath)){Directory.CreateDirectory(SavePath);}if (!SavePath.EndsWith("/")){SavePath = SavePath + "/";}var newSavePath = SavePath + classHead + "Root.cs";if (File.Exists(newSavePath)){File.Delete(newSavePath);}File.WriteAllText(newSavePath, result);AssetDatabase.Refresh();}[LabelText("json存储文件夹")][FolderPath]public string SavePath = "Assets/Scripts/";[ReadOnly]public string GenerateLog = "请输入json数据";private void Parse(JObject obj, StringBuilder sb, string className = "Root"){if (obj == null) return;List<JObject> objs = new List<JObject>();List<string> names = new List<string>();sb.AppendLine($"public class {classHead}{className}");sb.AppendLine("{");foreach (var p in obj.Properties()){if (p.Value.Type != JTokenType.Array){string type = "string";switch (p.Value.Type){case JTokenType.Object:var cm = UpperFirst(p.Name);sb.AppendLine($"    public {classHead}{cm} {p.Name};");names.Add(cm);objs.Add(p.Value as JObject);continue;case JTokenType.Integer:if ((long)p.Value > int.MaxValue){type = "long";}else{type = "int";}break;case JTokenType.Float:type = "float";break;case JTokenType.Boolean:type = "bool";break;case JTokenType.TimeSpan:type = "DateTime";break;}sb.AppendLine("    /// <summary>");sb.AppendLine($"    /// {p.Value}");sb.AppendLine("    /// </summary>");sb.AppendLine($"    public {type} {p.Name};");sb.AppendLine("");}else{var arr = p.Value as JArray;if (arr.Count > 0){var arrValue = arr[0];switch (arrValue.Type){case JTokenType.Object:var cmcmm = UpperFirst(p.Name);sb.AppendLine($"    public List<{classHead}{cmcmm}> {p.Name};");names.Add(cmcmm);objs.Add(arrValue as JObject);break;case JTokenType.String:sb.AppendLine($"    public List<string> {p.Name};");break;case JTokenType.Integer:sb.AppendLine($"    public List<int> {p.Name};");break;case JTokenType.Float:sb.AppendLine($"    public List<float> {p.Name};");break;case JTokenType.Boolean:sb.AppendLine($"    public List<bool> {p.Name};");break;}}else{sb.AppendLine($"    public List<string> {p.Name};");Debug.LogError($"json数组:{p.Name}为空");}}}sb.AppendLine("}");for (int i = 0; i < objs.Count; i++){Parse(objs[i], sb, names[i]);}}public static string UpperFirst(string str){if (string.IsNullOrEmpty(str)){return "";}var fstr = str.Substring(0, 1);fstr = fstr.ToUpper();return fstr + str.Substring(1, str.Length - 1);}
}

这篇关于Unity Json实体类快速生成保存工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116936

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven