开发者 / 类型

JSON转Rust结构体转换器

将JSON示例转换为派生serde的Serialize和Deserialize的Rust结构体,支持snake_case字段、重命名、为缺失或null键使用Option,以及为数组使用Vec。

JSON转Rust结构体转换器: 每个对象都会转换为一个包含公共字段的结构体。键名会转换为snake_case;如果JSON中的拼写不同,则会添加#[serde(rename = "…")];对于type等Rust关键字,则会使用原始标识符(r#type),serde会自动将其映射回原名称。在部分记录中缺失或为null的键会使用Option<T>,无法明确判断类型的值会使用serde_json::Value。多个示例的输出已使用serde 1进行编译,并用serde反序列化其示例数据。 完全在浏览器中本地运行,文件不会上传到服务器。

使用次数
在浏览器中
费用
免费·无需注册
可用性
可直接使用
JSON转Rust本地处理

完全在浏览器中运行

Rust

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Address {
    pub city: String,
    pub zip_code: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
    pub id: i64,
    pub user_name: String,
    pub avatar_url: String,
    pub score: f64,
    pub tags: Vec<String>,
    pub address: Address,
    pub manager_id: Option<i64>,
    #[serde(default)]
    pub nickname: Option<String>,
}

pub type UserList = Vec<User>;

需要serde(启用derive特性)和serde_json这两个crate。字段名会转换为snake_case;如果键名不同,则使用#[serde(rename)];在部分对象中缺失或为null的键会变为Option。除非示例包含小数,否则数字类型为i64。

读取和写入数据

使用serde_json::from_str::<Root>(&text)?进行反序列化,使用serde_json::to_string(&value)?进行序列化。输入中的未知键默认会被忽略;如需拒绝未知键,请在结构体中添加#[serde(deny_unknown_fields)]。

如需查看Go对同一示例的处理,请参阅JSON到Go;如需先整理示例,请使用JSON格式化工具。

Option和缺失的键

对于Option字段,缺失的键和值为null的情况都会反序列化为None。如果需要区分二者,请结合serde_with程序包使用Option<Option<T>>,或让该字段保留为serde_json::Value。

使用方法

  1. 粘贴JSON示例,最好使用包含多个典型记录的数组。
  2. 为顶层类型命名,并选择序列化时是否省略None字段。
  3. 将结构体复制到你的crate中,该crate需要serde和serde_json。

隐私与限制

JSON会在你的浏览器中转换,绝不会上传。

相关工具

常见问题

我需要哪些crate?

需要启用derive功能的serde,以及serde_json:在Cargo.toml中加入serde = { version = "1", features = ["derive"] }和serde_json = "1"。

为什么使用i64和f64?

它们可以安全容纳任何JSON数字。如果你确定数值范围,可将其缩小为u32、u8或f32。

可以改用#[serde(rename_all)]吗?

可以:如果每个键都遵循相同的命名约定,例如camelCase,那么在结构体上使用一个#[serde(rename_all = "camelCase")]即可替代单独的重命名设置。

免费工具·使用在浏览器中次·无需账户