编程理念
本JSON转换器采用模块化设计理念,旨在创建一个可扩展、易维护的代码结构。主要设计原则包括:
- 单一职责原则:每个类或模块只负责一个特定功能
- 开闭原则:系统对扩展开放,对修改关闭
- 依赖倒置原则:高层模块不依赖低层模块,二者都依赖抽象
- 关注点分离:将不同功能分离到不同模块中
模块化设计使得系统更易于维护和扩展,新功能的添加不会影响现有代码的稳定性。
系统架构
核心组件
主控制器,负责用户交互和函数分发
参数字符串分割器,处理嵌套函数和字符串内的逗号
字符串处理工具,提供JSON转义功能
错误消息提供者接口
错误消息提供者实现
工作流程
- 用户输入文本
- Trans类识别函数类型
- 调用对应函数处理器
- 使用ParameterSplitter分割参数
- 递归解析嵌套函数
- 使用StringUtils转义字符串
- 构建JSON结果
- 输出结果或错误信息
核心逻辑
函数识别逻辑
系统通过函数名前缀识别不同类型的函数调用:
// 函数前缀到处理器的映射 functionHandlers = new Dictionary<string, Func<string, string>> { { "r(", ParseRFunction }, { "t(", ParseTFunction }, { "sl(", ParseSlFunction }, { "sno(", ParseSnoFunction }, { "twr(", ParseTwrFunction } };
参数分割逻辑
ParameterSplitter类使用状态机模式处理参数分割:
- 跟踪括号嵌套层级(
parenCount
) - 标记是否在引号内(
inQuotes
) - 处理转义字符(
escapeNext
) - 只在最外层且不在引号内时分割逗号
错误处理逻辑
系统提供详细的错误信息和错误定位:
- 使用
>>>代码<<<
格式标记错误位置 - 通过IErrorMessages接口提供多语言错误消息
- 在解析嵌套函数时保留错误上下文
添加新方法的操作方式
步骤1: 创建新的函数处理方法
在Trans类中添加新的函数处理方法:
/// <summary> /// 解析new函数,创建newObject对象 /// 格式: new("str1", "str2") /// 示例: new("key", "value") => {"newObject":{"key":"value"}} /// </summary> private string ParseNewFunction(string input) { // 提取参数部分,去除外层的new() string parameters = input.Substring(4, input.Length - 5).Trim(); // 分割参数 var paramList = ParameterSplitter.SplitParameters(parameters); // 检查参数数量 if (paramList.Count != 2) { throw new ArgumentException(errorMessages.GetParameterCountError("new", 2, paramList.Count, parameters)); } string key = paramList[0].Trim(); string value = paramList[1].Trim(); // 检查参数是否为字符串格式 if (key.StartsWith("\"") && key.EndsWith("\"") && value.StartsWith("\"") && value.EndsWith("\"")) { // 提取字符串内容 string keyValue = key.Substring(1, key.Length - 2); string valueValue = value.Substring(1, value.Length - 2); // 构建JSON结果 return $"{{\"newObject\":{{\"{StringUtils.EscapeJsonString(keyValue)}\":\"{StringUtils.EscapeJsonString(valueValue)}\"}}}}"; } else { string errorDetails = ""; if (!(key.StartsWith("\"") && key.EndsWith("\""))) { errorDetails += errorMessages.GetParameterDetail("第一个", key); } if (!(value.StartsWith("\"") && value.EndsWith("\""))) { errorDetails += errorMessages.GetParameterDetail("第二个", value); } throw new ArgumentException(errorMessages.GetStringParametersError("new", errorDetails)); } }
步骤2: 注册新函数处理器
在Trans类的构造函数中注册新函数:
public Trans() { // 初始化错误消息提供者 errorMessages = new ErrorMessages(); // 初始化函数处理器 functionHandlers = new Dictionary<string, Func<string, string>> { { "r(", ParseRFunction }, { "t(", ParseTFunction }, { "sl(", ParseSlFunction }, { "sno(", ParseSnoFunction }, { "twr(", ParseTwrFunction }, { "new(", ParseNewFunction } // 添加新函数处理器 }; }
步骤3: 添加错误消息(可选)
如果需要新的错误消息类型,在IErrorMessages接口和ErrorMessages类中添加:
// IErrorMessages接口中添加 string GetNewFunctionError(string parameter); // ErrorMessages类中实现 public string GetNewFunctionError(string parameter) { return $"new函数处理错误: >>>{parameter}<<<\n请检查参数格式"; }
步骤4: 更新结构指南
在ErrorMessages类的GetChineseStructureGuide和GetEnglishStructureGuide方法中添加新函数的说明:
public string GetChineseStructureGuide() { return @" ...原有内容... 6.new(""key"",""value"")=>{""newObject"":{""key"":""value""}} 示例: new(""name"",""John"")=>{""newObject"":{""name"":""John""}} -------- "; }
使用示例
基本使用
输入: t("hello")
输出: {"text":"hello"}
输入: r(t("hello"), t("world"))
输出: {"rawtext":[{"text":"hello"},{"text":"world"}]}
嵌套使用
输入: twr("Hello %s and %s", t("Alice"), t("Bob"))
输出: {"translate":"Hello %s and %s","with":{"rawtext":[{"text":"Alice"},{"text":"Bob"}]}}
错误处理示例
输入: t(hello)
输出: t函数参数必须是字符串: >>>hello<<<
正确格式: t("文本内容")
注意事项
添加新功能时,请确保遵循以下注意事项:
- 确保新函数的前缀唯一,不会与其他函数冲突
- 正确处理参数验证和错误处理
- 考虑嵌套函数调用的可能性
- 确保JSON输出的格式正确
- 更新文档和错误消息以反映新功能
扩展建议
- 添加函数类型枚举:虽然当前使用字典直接映射,但可以添加函数类型枚举提高可读性
- 配置文件支持:将函数映射和错误消息外置到配置文件中
- 单元测试:为每个函数处理器添加单元测试
- 更多字符串处理:添加对数字、布尔值等非字符串参数的支持
- 性能优化:对于复杂嵌套,考虑使用解析器生成器或表达式树
JSON转换工具
使用下面的工具可以直接在文件中体验JSON转换功能:
输入
输出结果
支持的功能函数
以下是在JavaScript中实现的函数(风催花了老半天才处理完C#转Js以及其事件映射QAQ):
创建rawtext数组
示例: r(t("hello"), t("world"))
创建text对象
示例: t("hello")
创建selector对象
示例: sl("@a")
创建score对象
示例: sno("player", "objective")
创建translate对象
示例: twr("hello %%1", t("world"))
支持我们的项目
您的赞助将帮助我们持续改进,感谢您的支持!
选择赞助方式
选择赞助金额
项目说明
感谢您考虑赞助我们的项目!您的支持将直接用于:
- 项目持续开发和维护
- 服务器和基础设施成本
- 功能改进和用户体验优化
让风催在苦逼的大学生活中得到一点零食
我们会认真对待每一位赞助者的支持,并确保资源得到最有效的利用。
感谢赞助!!!
您的支持对风催意义重大!