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

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.