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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:05