Tauri应用中JS向Rust传递Map数据未被接收问题求助
解决Tauri中JS Map无法被Rust后端接收的问题
JavaScript的Map类型无法被JSON标准序列化,通过Tauri的invoke传递时会被序列化为空对象{},导致Rust后端的HashMap接收不到数据。以下是两种可行的解决方法:
方案一:前端将Map转换为普通对象(推荐)
在调用invoke前,把items从Map转为普通键值对对象,使其能被标准JSON序列化:
async function handleSubmit(e) { e.preventDefault(); // 转换Map为普通对象 const submitData = { ...details, items: Object.fromEntries(details.items) }; await invoke('submit_new_customer', { details: submitData }).then((submitted) => { // 后续逻辑 }); }
转换后items会变成{ '3': 1 },后端原有的HashMap<String, usize>无需修改即可正常接收数据。
方案二:后端通过Serde扩展支持JS Map
如果不想修改前端代码,可以使用serde_with库扩展Serde的反序列化能力:
- 在
Cargo.toml中添加依赖:
[dependencies] serde_with = "3.4"
- 修改Rust结构体,添加
serde_as属性配置:
use serde_with::serde_as; use std::collections::HashMap; #[serde_as] #[derive(Serialize, Deserialize, Debug)] struct NewCustomerInput { name: String, country: String, address: Option<String>, // 配置为兼容JS Map的反序列化规则 #[serde_as(as = "serde_with::maps::FlexibleKey")] items: HashMap<String, usize> }
内容的提问来源于stack exchange,提问作者András Krausz
相关产品推荐
相关产品推荐

