如何替换配置文本中动态变化的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
相关产品推荐
相关产品推荐

