序列化 from/to null

Serialize from/to null

提问人:Thomas W 提问时间:11/17/2023 更新时间:11/22/2023 访问量:58

问:

我想出了如何在 JSON 中将类似单元的枚举变体序列化为,但是有没有一种简单的方法可以在不编写专用反序列化函数的情况下对其进行反序列化?nullnull

use serde::{Serialize, Deserialize};
use serde_json::from_str;

#[derive(Serialize, Deserialize)]
struct Entry(String, String);

#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum Action {
    #[serde(serialize_with = "serde::ser::Serializer::serialize_none")]
    Delete(),
    Create(Entry),
}
type Actions = Vec<Action>;

#[test]
fn this_works() {
  from_str::<Actions>(r#"[["id", "value"], []]"#).unwrap();
}

#[test]
fn this_does_not_work() {
  // ... but this is what I would like to use
  from_str::<Actions>(r#"[["id", "value"], null]"#).unwrap();
}

查看 Rust Playground

json rust serde

评论

1赞 cafce25 11/17/2023
您可以制作(不带括号!)和,但这意味着您当前工作的解决方案不再起作用。Delete#[default]#[derive(Default)]
0赞 Thomas W 11/17/2023
@cafce25这正是我一直在寻找的。你能把它变成一个我能接受的答案吗?

答:

0赞 Thomas W 11/22/2023 #1

正如 @cafce25 所指出的,这按预期工作:

use serde::{Serialize, Deserialize};
use serde_json::from_str;

#[derive(Serialize, Deserialize)]
struct Entry(String, String);

#[derive(Serialize, Deserialize, Default)]
#[serde(untagged)]
enum Action {
    #[default]
    Delete,
    Create(Entry),
}
type Actions = Vec<Action>;

#[test]
fn works() {
  from_str::<Actions>(r#"[["id", "value"], null]"#).unwrap();
}

Rust Playground 上试用。