如何在Substrate pallet中使用serde_json,解决getrandom编译报错问题
问题根因
你遇到的编译错误是由于Substrate Runtime需要编译为wasm32-unknown-unknown目标,而默认引入的serde_json依赖包含getrandom库,这个库不支持无操作系统的WASM环境,因此触发编译失败。
解决方案
1. 调整pallet中serde_json的依赖配置
在你自定义pallet的Cargo.toml中,修改serde_json的引入规则,禁用默认特性,仅开启适配no_std环境的alloc特性:
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
2. 同步pallet的特性关联配置
在pallet Cargo.toml的[features]段,将serde_json的std特性与pallet本身的std特性绑定,保证编译原生节点二进制时开启std功能,编译WASM runtime时自动关闭不必要的系统依赖:
[features] default = ["std"] std = [ "serde_json/std", # 此处保留你原有其他依赖的std配置,比如frame-support/std、frame-system/std等 ]
3. 修正JSON解析逻辑
你当前代码里json!(data_str)的写法是将字符串直接转为JSON字符串值,不会解析JSON格式的内容,需要改为用serde_json::from_str解析,同时不要使用unwrap避免Runtime panic:
首先在pallet的Error枚举中新增无效JSON的错误项:
#[error("Invalid JSON format")] InvalidJsonFormat,
然后修改业务代码:
// 原来的代码 // let data_str = String::from_utf8(data.clone()).unwrap(); // let data_json = json!(data_str); // 替换为 let data_str = String::from_utf8(data.clone()).map_err(|_| Error::<T>::InvalidJsonFormat)?; let data_json: serde_json::Value = serde_json::from_str(&data_str).map_err(|_| Error::<T>::InvalidJsonFormat)?;
4. 校验runtime侧依赖配置
检查node/runtime/Cargo.toml中你自定义pallet的引入配置,确保配置符合Substrate规范:
pallet-your-custom = { path = "../pallets/your-custom", default-features = false, version = "3.0.0" }
同时在runtime的[features]的std列表中添加对应项:
std = [ # ... 其他原有依赖项 "pallet-your-custom/std", ]
做完以上修改后重新编译即可正常在pallet中使用serde_json的基础解析、序列化功能。
内容的提问来源于stack exchange,提问作者Aaditya Srivastava
相关产品推荐
相关产品推荐

