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

如何在C# WebBrowser控件中向JavaScript函数传递JSON数组?代码调用失败

问题分析与解决步骤

你的代码无法正常运行的核心原因是参数结构不匹配,另外还有一些细节可以优化,下面一步步给你拆解:

1. 最关键的问题:参数结构不符合JS函数预期

你的JS函数第二个参数期望的是一个直接的数组(比如[{"name":"foo",...},...]),但你在C#里把数组包装在了一个带items属性的匿名对象里,导致JS拿到的是{items: [数组内容]},完全不是它要的格式。

修正后的C#代码

直接传递匿名类型数组即可,不需要外层的items包装:

Object[] jsParams = new Object[3];
jsParams[0] = "test"; // C#会自动装箱,不需要强制转Object
jsParams[1] = new[] { 
    new { name = "foo", value = "21980" },
    new { name = "bar", value = "100" },
    new { name = "foo", value = "27492328" },
    new { name = "bar", value = "WEB21980001831" }
};
jsParams[2] = "test";
this.webBrowserCtl.Document.InvokeScript("jsFunction", jsParams);

2. 备选方案:手动序列化JSON字符串(如果自动转换失效)

如果WebBrowser控件的CLR对象到JS对象自动转换出现问题(比如某些环境下匿名类型转换异常),可以手动把数组序列化为JSON字符串,再在JS里解析:

C#端代码(需要引用System.Web.Extensions)

using System.Web.Script.Serialization;

// ...

// 构建数组
var dataArray = new[] { 
    new { name = "foo", value = "21980" },
    new { name = "bar", value = "100" },
    new { name = "foo", value = "27492328" },
    new { name = "bar", value = "WEB21980001831" }
};
// 序列化为JSON字符串
var serializer = new JavaScriptSerializer();
string jsonString = serializer.Serialize(dataArray);

// 组装参数
Object[] jsParams = new Object[3];
jsParams[0] = "test";
jsParams[1] = jsonString;
jsParams[2] = "test";
this.webBrowserCtl.Document.InvokeScript("jsFunction", jsParams);

对应JS函数修改

需要把传入的字符串解析为数组:

function jsFunction(str1, jsonStr, str2) {
    // 解析JSON字符串为数组
    var jsonArray = JSON.parse(jsonStr);
    // 你的业务逻辑...
}

3. 额外优化:修复JS函数的参数名冲突

你的JS函数定义了两个同名的string参数:function jsFunction(string, jsonArray, string),虽然JS语法允许,但后面的参数会覆盖前面的,容易引发逻辑错误,建议改成不同的命名,比如:

function jsFunction(str1, jsonArray, str2) {
    // 逻辑代码...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:00:31