You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换配置文本中动态变化的pass字段值?

问题描述

我有如下JSON格式的配置文本:

"algo": null,
"coin": null,
"url": "Domain",
"user": "UserWord",
"pass": "TP661",
"rig-id": null,
"nicehash": false,
"keepalive": true,
"enabled": true,
"tls": true,
"tls-fingerprint": null,
"daemon": false,
"socks5": null,
"self-select": null,
"submit-to-origin": false

其中pass字段的值(比如示例里的TP661)是动态变化的,我需要替换这个字段的取值。

我尝试用以下C#代码实现,但逻辑存在问题,原本想修改整个pass行,现在需要正确的实现方法:

private void btn_replace_Click(object sender, EventArgs e)
{
    string[] lines = richTextBox1.Text.Split('\n');
    string split = "pass";
    var sb = new StringBuilder();
    foreach (var item in lines)
    {
        sb.AppendLine(item);
        //foreach (var item2 in split)
        {
            if (item.Contains(split))
            {
                sb.Replace(split, txt_replace.Text);
            }
        }
    }
    richTextBox1.Text = sb.ToString();
}
原代码的问题
  • 逻辑顺序错误:先把原行添加到StringBuilder再执行替换,会直接把行里的"pass"字符串替换成输入内容,比如将"pass": "TP661",变成"新内容": "TP661",,完全偏离需求。
  • 匹配逻辑粗糙:仅通过包含pass字符串判断,容易误改其他可能出现该字符串的内容,扩展性差。
正确实现方法

方法一:逐行字符串处理(适合简单场景)

直接针对每行文本精准匹配pass字段并替换:

private void btn_replace_Click(object sender, EventArgs e)
{
    string[] lines = richTextBox1.Text.Split(new[] { '\n' }, StringSplitOptions.None);
    var sb = new StringBuilder();
    string newPassValue = txt_replace.Text.Trim();
    // 生成符合格式的新pass行
    string newPassLine = $"\"pass\": \"{newPassValue}\",";

    foreach (var line in lines)
    {
        if (line.TrimStart().StartsWith("\"pass\":"))
        {
            sb.AppendLine(newPassLine);
        }
        else
        {
            sb.AppendLine(line);
        }
    }

    richTextBox1.Text = sb.ToString();
}

方法二:JSON序列化解析(推荐,更可靠)

因为配置是JSON格式,用官方JSON库解析修改,能避免字符串处理的各种格式问题:

使用System.Text.Json(.NET Core/.NET 5+)

using System.Text.Json;
using System.IO;

private void btn_replace_Click(object sender, EventArgs e)
{
    string configText = richTextBox1.Text;
    // 给原文本补全大括号,组成合法JSON对象
    using var doc = JsonDocument.Parse("{" + configText + "}");
    var root = doc.RootElement.Clone();

    using var ms = new MemoryStream();
    using var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true });
    
    writer.WriteStartObject();
    foreach (var prop in root.EnumerateObject())
    {
        if (prop.Name == "pass")
        {
            writer.WriteString("pass", txt_replace.Text.Trim());
        }
        else
        {
            prop.WriteTo(writer);
        }
    }
    writer.WriteEndObject();
    writer.Flush();

    // 转换为字符串后去除首尾大括号,还原原格式
    string newConfig = JsonSerializer.Deserialize<string>(ms.ToArray()).Trim('{', '}').Trim();
    richTextBox1.Text = newConfig;
}

使用Newtonsoft.Json(兼容.NET Framework)

using Newtonsoft.Json.Linq;

private void btn_replace_Click(object sender, EventArgs e)
{
    string configText = richTextBox1.Text;
    // 补全大括号解析为JSON对象
    JObject configObj = JObject.Parse("{" + configText + "}");
    // 替换pass字段值
    configObj["pass"] = txt_replace.Text.Trim();
    // 转换为格式化字符串后去除首尾大括号
    string newConfig = configObj.ToString(Newtonsoft.Json.Formatting.Indented).Trim('{', '}').Trim();
    richTextBox1.Text = newConfig;
}

说明

JSON解析的方式更可靠,无论pass行的格式如何变化(比如空格位置调整),只要是合法JSON就能正确替换,不会出现误操作。如果原配置本身是带大括号的完整JSON对象,可去掉代码中添加/去除大括号的逻辑。

内容的提问来源于stack exchange,提问作者Inferno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:00:57