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

C#解析JSON时触发未处理异常:RuntimeBinderException求助

问题解决:JsonDocument.Parse参数类型不匹配报错

错误原因

你这里犯了重复处理的错误:

  • 先用JavaScriptSerializer.Deserialize()把下载的JSON字符串转换成了动态对象json_data
  • 接着又把这个已经反序列化的对象传给JsonDocument.Parse(),但**JsonDocument.Parse()只接受原始JSON字符串、字节数组这类未解析的JSON数据**,不接受已反序列化的对象,因此触发类型不匹配异常。

两种修正方案

方案1:直接用System.Text.Json处理(推荐)

放弃JavaScriptSerializer,统一用System.Text.Json解析原始JSON字符串,代码更简洁规范:

private void Form1_Load(object sender, EventArgs e)
{
    Label unit_used = label3;

    string QUERY_URL = "JSON URL HERE";
    Uri queryUri = new Uri(QUERY_URL);

    using (System.Net.WebClient client = new System.Net.WebClient())
    {
        // 获取原始JSON字符串
        string rawJson = client.DownloadString(queryUri);
        // 用JsonDocument解析原始字符串,using声明自动释放资源
        using var jsonDocument = JsonDocument.Parse(rawJson);
        
        var rootElement = jsonDocument.RootElement;
        var unit = rootElement.GetProperty("unit").GetString();
        
        unit_used.Text = unit;
    }
}

方案2:继续使用JavaScriptSerializer

既然已经完成反序列化,直接从动态对象中读取属性即可,无需再调用JsonDocument.Parse():

private void Form1_Load(object sender, EventArgs e)
{
    Label unit_used = label3;

    string QUERY_URL = "JSON URL HERE";
    Uri queryUri = new Uri(QUERY_URL);

    using (System.Net.WebClient client = new System.Net.WebClient())
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        dynamic json_data = js.Deserialize(client.DownloadString(queryUri), typeof(object));
        
        // 直接从动态对象获取unit属性值
        string unit = json_data["unit"];
        unit_used.Text = unit;
    }
}

额外建议:改用更现代的HttpClient

WebClient是旧版API,新项目建议用HttpClient,支持异步操作避免阻塞UI线程:

// 在Form类中声明静态HttpClient实例(全局复用)
private static readonly HttpClient _httpClient = new HttpClient();

private async void Form1_Load(object sender, EventArgs e)
{
    Label unit_used = label3;
    string QUERY_URL = "JSON URL HERE";
    
    try
    {
        string rawJson = await _httpClient.GetStringAsync(QUERY_URL);
        using var jsonDocument = JsonDocument.Parse(rawJson);
        string unit = jsonDocument.RootElement.GetProperty("unit").GetString();
        unit_used.Text = unit;
    }
    catch (Exception ex)
    {
        // 添加异常处理,比如提示用户加载失败
        unit_used.Text = "加载失败";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:20:08