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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:17