JSON转换器

作者: Funrestan-风催竹残 | 版本: 2.1 | 最后更新: 2025.8.31

说明文档
转换工具
赞助支持

编程理念

本JSON转换器采用模块化设计理念,旨在创建一个可扩展、易维护的代码结构。主要设计原则包括:

  • 单一职责原则:每个类或模块只负责一个特定功能
  • 开闭原则:系统对扩展开放,对修改关闭
  • 依赖倒置原则:高层模块不依赖低层模块,二者都依赖抽象
  • 关注点分离:将不同功能分离到不同模块中

模块化设计使得系统更易于维护和扩展,新功能的添加不会影响现有代码的稳定性。

系统架构

核心组件

Trans类

主控制器,负责用户交互和函数分发

ParameterSplitter类

参数字符串分割器,处理嵌套函数和字符串内的逗号

StringUtils类

字符串处理工具,提供JSON转义功能

IErrorMessages接口

错误消息提供者接口

ErrorMessages类

错误消息提供者实现

工作流程

  1. 用户输入文本
  2. Trans类识别函数类型
  3. 调用对应函数处理器
  4. 使用ParameterSplitter分割参数
  5. 递归解析嵌套函数
  6. 使用StringUtils转义字符串
  7. 构建JSON结果
  8. 输出结果或错误信息

核心逻辑

函数识别逻辑

系统通过函数名前缀识别不同类型的函数调用:

// 函数前缀到处理器的映射
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):

r(value1, value2, ...)

创建rawtext数组

示例: r(t("hello"), t("world"))

t("text")

创建text对象

示例: t("hello")

sl("selector")

创建selector对象

示例: sl("@a")

sno("name", "objective")

创建score对象

示例: sno("player", "objective")

twr("translate", value1, value2, ...)

创建translate对象

示例: twr("hello %%1", t("world"))

支持我们的项目

您的赞助将帮助我们持续改进,感谢您的支持!

Funrestan-风催竹残

选择赞助方式

支付宝
微信支付

选择赞助金额

0.01元
让风催感受到支持✊✊✊
自定义
支持开源和无私更新

项目说明

感谢您考虑赞助我们的项目!您的支持将直接用于:

  • 项目持续开发和维护
  • 服务器和基础设施成本
  • 功能改进和用户体验优化
  • 让风催在苦逼的大学生活中得到一点零食

我们会认真对待每一位赞助者的支持,并确保资源得到最有效的利用。

感谢赞助!!!

您的支持对风催意义重大!

感谢图片