我有一个枚举:

#[derive(Serialize, Deserialize)]
enum Action {
    Join,
    Leave,
}

和一个 struct :

#[derive(Serialize, Deserialize)]
struct Message {
    action: Action,
}

并且我传递了一个JSON字符串:

"{\"action\":0}" // `json_string` var

但当我try 像这样反序列化时:

let msg: Message = serde_json::from_str(json_string)?;

我得到错误expected value at line 1 column 11.

在JSON中,如果我将数字0替换为字符串"Join",则它可以工作,但我希望数字与Action枚举值相对应(0表示Action::Join,1表示Action::Leave),因为它来自打字请求.有没有一种简单的方法来实现这一点?

推荐答案

你想要serde_repr

以下是库自述文件中的示例代码:

use serde_repr::{Serialize_repr, Deserialize_repr};

#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
enum SmallPrime {
    Two = 2,
    Three = 3,
    Five = 5,
    Seven = 7,
}

fn main() -> serde_json::Result<()> {
    let j = serde_json::to_string(&SmallPrime::Seven)?;
    assert_eq!(j, "7");

    let p: SmallPrime = serde_json::from_str("2")?;
    assert_eq!(p, SmallPrime::Two);

    Ok(())
}

对于您的 case :

use serde_repr::{Serialize_repr, Deserialize_repr};

#[derive(Serialize_repr, Deserialize_repr)]
#[repr(u8)]
enum Action {
    Join = 0,
    Leave = 1,
}

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Message {
    action: Action,
}

Json相关问答推荐

筛选JSON数组以使用Jolt仅保留具有最新日期/时间的条目

如何在PowerShell中扩展JSON中的嵌套数组

为什么JQ筛选器不将原始输入打印为$var|.';文档?

在AWS步骤函数中将字符串解析为JSON&S映射状态

在Vega中如何通过滑块改变条形图的宽度

如何避免解析 ISuperObject 类型字段中的 json 对象

如何使用 JOLT 使用输入数组中的值和层次 struct 中的其他字段创建数组

未知的META规范,无法验证.[规范v1.0.1]

当值包含ansible中的字符串时解析json值

如何在 Go 中生成带有排序键的 JSON?

Spring MVC 4:application/json内容类型设置不正确

Java JSON 序列化 - 最佳实践

json和空数组

使用 API 搜索维基百科

使用 Node.js 对 JSON 中的字符串大小有限制吗?

为不同类型的项目数组正确的 JSON Schema

如何访问 JSON 对象数组的第一个元素?

在android中使用GSON解析带有动态key和value的JSON

如何向 json IAM 策略添加 comments ?

在 .NET 中缩小缩进的 JSON 字符串