讲师中心 微信公众号
AI工具推荐 视频效率加速

在WebView2中通过JSON序列化在C#与JavaScript之间传递数组

陌丽君_1578

陌丽君_1578

发布时间:2025-11-20 11:44:57

|

876人浏览过

|

来源于php中文网

原创

在WebView2中通过JSON序列化在C#与JavaScript之间传递数组

在webview2环境中,直接从c#向javascript传递数组等复杂数据类型时,可能会遇到数据丢失或格式不匹配的问题。本教程将详细介绍一种健壮且通用的解决方案:利用json序列化。通过在c#端将数组转换为json字符串,然后在javascript端解析该字符串,可以确保复杂数据结构在两种语言之间准确无误地传递和重构,从而实现高效可靠的跨语言通信。

引言:C#与JavaScript数组传递的挑战

在开发基于WebView2的应用程序,特别是像VSTO Office Add-in这类需要C#后端逻辑与JavaScript前端交互的场景时,我们经常面临跨语言数据传递的需求。对于简单的字符串或基本数值类型,C#与JavaScript之间的直接传递通常表现良好。然而,当涉及到数组、对象等复杂数据类型时,直接的对象映射(如通过window.chrome.webview.hostObjects)可能无法按预期工作,导致JavaScript端接收到空数组或不完整的数据。

例如,一个C#的二维整数数组int[,] xx = { { 1, 2, 3 }, { 3, 4, 5 } };在尝试直接返回给JavaScript时,JavaScript控制台可能显示Array(0)或[],这表明数据并未正确地传递和解析。这种现象的根本原因在于,WebView2的宿主对象机制在处理复杂类型时,可能无法直接进行深层的数据结构转换,或者默认的转换规则不符合预期。

解决方案核心:JSON序列化与反序列化

为了解决C#与JavaScript之间复杂数据类型的传递问题,最通用、最健壮的方法是采用JSON(JavaScript Object Notation)作为中间数据格式。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它被广泛应用于各种语言和平台之间的数据通信。

其核心思想是:

立即学习“Java免费学习笔记(深入)”;

  1. C#端序列化: 在C#代码中,将需要传递的数组或对象序列化(转换)成一个JSON格式的字符串。
  2. 跨语言传递: 将这个JSON字符串作为普通字符串从C#传递给JavaScript。
  3. JavaScript端反序列化: 在JavaScript代码中,接收到JSON字符串后,将其反序列化(解析)回原生的JavaScript对象或数组。

这种方法确保了数据的完整性和结构的一致性,无论数据多么复杂,只要能表示为JSON,就能在两端之间可靠地传递。

前端设计引擎
前端设计引擎

使用此技能可创建独具特色、具备生产级质量的前端界面,设计品质高。当用户要求构建网页组件、页面、产物、海报或应用程序时(例如:网站、落地页、仪表盘、React 组件、HTML/CSS 布局,或对任意 Web UI 进行样式优化与视觉美化),请启用该能力。输出需为富有创意、精雕细琢的代码与 UI 设计,避免千篇一律的 AI 风格。

下载

C#端实现:将数组序列化为JSON字符串

在C#中,我们可以使用System.Text.Json命名空间下的JsonSerializer类(.NET Core 3.0+及.NET 5+内置)或流行的第三方库Newtonsoft.Json来完成JSON序列化。这里我们推荐使用System.Text.Json,因为它通常具有更好的性能和与.NET生态的紧密集成。

首先,确保你的项目引用了System.Text.Json(如果不是.NET Core/.NET 5+项目,可能需要通过NuGet安装)。

using System;
using System.Text.Json; // 引入System.Text.Json命名空间

public class HostObject
{
    public string GetArrayAsJson()
    {
        int[,] xx = { { 1, 2, 3 }, { 3, 4, 5 } };

        // 为了将多维数组正确序列化为JSON数组的数组,
        // 最好先将其转换为List<List<int>>或其他更易于序列化的结构。
        // 或者直接序列化,但JavaScript端可能需要特殊处理。
        // 对于本例,我们将其转换为List<int[]>以便JsonSerializer能更好地处理。
        // 更直接的方式是转换为List<List<int>>
        var list = new System.Collections.Generic.List<System.Collections.Generic.List<int>>();
        for (int i = 0; i < xx.GetLength(0); i++)
        {
            var row = new System.Collections.Generic.List<int>();
            for (int j = 0; j < xx.GetLength(1); j++)
            {
                row.Add(xx[i, j]);
            }
            list.Add(row);
        }

        // 使用JsonSerializer将List<List<int>>序列化为JSON字符串
        string jsonString = JsonSerializer.Serialize(list);
        Console.WriteLine($"C# serialized JSON: {jsonString}");
        return jsonString;
    }

    // 示例:传递一个字符串数组
    public string GetStringArrayAsJson()
    {
        string[] names = { "Alice", "Bob", "Charlie" };
        string jsonString = JsonSerializer.Serialize(names);
        Console.WriteLine($"C# serialized string array JSON: {jsonString}");
        return jsonString;
    }

    // 示例:传递一个匿名对象数组
    public string GetObjectArrayAsJson()
    {
        var users = new[]
        {
            new { Id = 1, Name = "Alice" },
            new { Id = 2, Name = "Bob" }
        };
        string jsonString = JsonSerializer.Serialize(users);
        Console.WriteLine($"C# serialized object array JSON: {jsonString}");
        return jsonString;
    }
}

在上述代码中,GetArrayAsJson方法将一个二维整数数组转换为List>,然后使用JsonSerializer.Serialize方法将其序列化为一个JSON字符串。GetStringArrayAsJson和GetObjectArrayAsJson展示了如何处理一维字符串数组和匿名对象数组。

JavaScript端实现:接收并解析JSON字符串

在JavaScript端,我们通过window.chrome.webview.hostObjects调用C#方法后,会接收到一个JSON字符串。我们需要使用JavaScript内置的JSON.parse()方法将这个字符串解析回原生的JavaScript数组或对象。

// 假设C#的HostObject实例被命名为'control'并暴露给JavaScript
class WebView2HostInterface {
    async getArrayFromCSharp() {
        return new Promise(async (resolve, reject) => {
            try {
                // 调用C#方法,该方法返回一个JSON字符串
                let jsonString = await window.chrome.webview.hostObjects.control.GetArrayAsJson();
                console.log("Received JSON string from C#:", jsonString);

                // 使用JSON.parse()将JSON字符串解析为JavaScript数组
                let resultArray = JSON.parse(jsonString);
                console.log("Parsed JavaScript array:", resultArray);
                console.log("Type of parsed result:", typeof resultArray);
                console.log("Is it an array?", Array.isArray(resultArray));
                resolve(resultArray);
            } catch (error) {
                console.error("Error getting array from C#:", error);
                reject(error);
            }
        });
    }

    async getStringArrayFromCSharp() {
        return new Promise(async (resolve, reject) => {
            try {
                let jsonString = await window.chrome.webview.hostObjects.control.GetStringArrayAsJson();
                let resultArray = JSON.parse(jsonString);
                console.log("Parsed JavaScript string array:", resultArray);
                resolve(resultArray);
            } catch (error) {
                console.error("Error getting string array from C#:", error);
                reject(error);
            }
        });
    }

    async getObjectArrayFromCSharp() {
        return new Promise(async (resolve, reject) => {
            try {
                let jsonString = await window.chrome.webview.hostObjects.control.GetObjectArrayAsJson();
                let resultArray = JSON.parse(jsonString);
                console.log("Parsed JavaScript object array:", resultArray);
                resolve(resultArray);
            } catch (error) {
                console.error("Error getting object array from C#:", error);
                reject(error);
            }
        });
    }
}

// 示例调用
const hostInterface = new WebView2HostInterface();
hostInterface.getArrayFromCSharp().then(data => {
    console.log("Successfully received and parsed array:", data);
}).catch(err => {
    console.error("Failed to get array:", err);
});

hostInterface.getStringArrayFromCSharp().then(data => {
    console.log("Successfully received and parsed string array:", data);
});

hostInterface.getObjectArrayFromCSharp().then(data => {
    console.log("Successfully received and parsed object array:", data);
});

通过上述JavaScript代码,JSON.parse(jsonString)将把C#传递过来的JSON字符串转换为一个真正的JavaScript数组,你可以像操作任何JavaScript数组一样操作它。

优势与最佳实践

  1. 数据完整性与类型匹配: JSON作为一种通用格式,能够准确地表示各种复杂的数据结构,包括嵌套数组和对象,确保数据在C#和JavaScript之间传递时保持其完整性和原始结构。
  2. 语言无关性: JSON是一种标准格式,不依赖于任何特定的编程语言,因此它不仅适用于C#和JavaScript,也适用于与其他语言的交互。
  3. 可读性强: JSON格式直观易懂,便于调试和排查问题。
  4. 错误处理: 在C#端序列化和JavaScript端反序列化时,都应包含错误处理机制(如try-catch块),以应对数据格式不正确或网络传输中断等异常情况。
  5. 性能考虑: 对于非常大的数据集,序列化和反序列化可能会带来一定的性能开销。在这些情况下,可以考虑对数据进行分页或增量加载,或者评估其他二进制序列化方案(如果性能是关键瓶颈)。然而,对于大多数WebView2应用场景,JSON的性能开销通常可以忽略不计。
  6. 数据类型映射: 了解JSON如何映射C#和JavaScript的数据类型至关重要。例如,C#的int、double会映射为JSON数字,string映射为JSON字符串,bool映射为JSON布尔值,List或T[]映射为JSON数组,自定义类或匿名对象映射为JSON对象。

总结

在WebView2环境中,为了实现C#与JavaScript之间复杂数据类型(尤其是数组和对象)的可靠传递,采用JSON序列化和反序列化是一种标准且高效的解决方案。通过在C#端将数据结构转换为JSON字符串,并在JavaScript端将其解析回来,开发者可以确保数据的完整性和一致性,从而构建出更加健壮和功能丰富的跨平台应用。这种方法不仅解决了数据类型不匹配的问题,还为C#和JavaScript之间的灵活数据交换提供了一个通用的、易于维护的框架。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2195

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3482

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1176

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4019

2025.09.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2826

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5659

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4027

2026.03.24

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3171

2023.10.31

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn