编程理念
本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"))
支持我们的项目
您的赞助将帮助我们持续改进,感谢您的支持!
选择赞助方式
选择赞助金额
项目说明
感谢您考虑赞助我们的项目!您的支持将直接用于:
- 项目持续开发和维护
- 服务器和基础设施成本
- 功能改进和用户体验优化
让风催在苦逼的大学生活中得到一点零食
我们会认真对待每一位赞助者的支持,并确保资源得到最有效的利用。
感谢赞助!!!
您的支持对风催意义重大!