使用C# .NET 6.0替换JSON文件中pair_whitelist数组的方法咨询
解决.NET 6中替换JSON文件数组的问题
错误原因说明
你遇到的RuntimeBinderException是因为使用JsonSerializer.Deserialize<ExpandoObject>时,默认只会将根节点转为ExpandoObject,嵌套的exchange对象会被解析为JsonElement类型,直接访问config.exchange.pair_whitelist自然会报错——JsonElement没有该属性。
下面提供三种可行的解决方案:
方案1:使用强类型模型(推荐)
强类型模型能在编译阶段检查错误,更稳定可靠。
首先定义与JSON结构匹配的模型类:
using System.Text.Json.Serialization; public class RootConfig { [JsonPropertyName("exchange")] public ExchangeConfig Exchange { get; set; } // 其他不需要修改的属性可按需添加,或忽略 } public class ExchangeConfig { [JsonPropertyName("pair_whitelist")] public List<string> PairWhitelist { get; set; } // 其他嵌套属性同理 }
然后完成读取、修改、写入操作:
// 读取JSON文件内容 var jsonContent = File.ReadAllText(path_to_JSON_file); // 反序列化为强类型对象 var config = JsonSerializer.Deserialize<RootConfig>(jsonContent); // 替换目标数组 config.Exchange.PairWhitelist = new List<string> { "SKM/USDT", "NEW/USDT", "XEC/USDT" }; // 写回文件,保留格式化缩进 var serializeOptions = new JsonSerializerOptions { WriteIndented = true }; var updatedJson = JsonSerializer.Serialize(config, serializeOptions); File.WriteAllText(path_to_JSON_file, updatedJson);
方案2:配置序列化选项让嵌套对象转为ExpandoObject
如果不想定义模型,可通过配置JsonSerializerOptions,让所有嵌套对象都转为ExpandoObject:
using System.Dynamic; using System.Text.Json; using System.Text.Json.Serialization; public static dynamic GetJSONFromFile_dynamic(string path) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 关键配置:将嵌套对象也转为ExpandoObject Converters = { new ExpandoObjectConverter() } }; var data = File.ReadAllText(path); return JsonSerializer.Deserialize<ExpandoObject>(data, options); } // 调用修改逻辑 var config = GetJSONFromFile_dynamic(path_to_JSON_file); config.exchange.pair_whitelist = new List<string> { "SKM/USDT", "NEW/USDT", "XEC/USDT" }; // 写回文件 var serializeOptions = new JsonSerializerOptions { WriteIndented = true }; var updatedJson = JsonSerializer.Serialize(config, serializeOptions); File.WriteAllText(path_to_JSON_file, updatedJson);
方案3:使用JsonDocument手动修改(无模型场景)
通过JsonDocument遍历JSON节点,手动替换目标数组:
using System.Text.Json; // 读取并解析JSON using var doc = JsonDocument.Parse(File.ReadAllText(path_to_JSON_file)); var root = doc.RootElement; // 准备新的数组元素 var newWhitelistItems = new[] { "SKM/USDT", "NEW/USDT", "XEC/USDT" }; // 写入修改后的JSON using var fileStream = File.OpenWrite(path_to_JSON_file); using var writer = new Utf8JsonWriter(fileStream, new JsonWriterOptions { Indented = true }); writer.WriteStartObject(); foreach (var rootProp in root.EnumerateObject()) { if (rootProp.Name == "exchange") { writer.WriteStartObject("exchange"); foreach (var exchangeProp in rootProp.Value.EnumerateObject()) { if (exchangeProp.Name == "pair_whitelist") { // 写入新数组 writer.WriteStartArray("pair_whitelist"); foreach (var item in newWhitelistItems) { writer.WriteStringValue(item); } writer.WriteEndArray(); } else { // 保留原有属性 exchangeProp.WriteTo(writer); } } writer.WriteEndObject(); } else { // 保留根节点其他属性 rootProp.WriteTo(writer); } } writer.WriteEndObject(); writer.Flush();
内容的提问来源于stack exchange,提问作者Oleksandr Myronchuk
相关产品推荐
相关产品推荐

