【问题标题】:Deserializing JSON with multiple possible values with rust使用 rust 反序列化具有多个可能值的 JSON
【发布时间】:2020-09-18 18:43:57
【问题描述】:

所以我正在用 Rust 编写一个程序(我对它很陌生),它读取一个 json 配置文件并根据输入做一些事情。我已经成功地使用serde_json 解析了 json。我想让用户做的下一件事是能够指定一些高级选项,但我不知道如何解析输入。 默认的 json 看起来像这样:

{
  value: true
}

解析 this 可以直接得到这样的结构:

#[derive(Deserialize)]
pub struct Config {
  value: bool
}

我将如何为用户添加能够输入boolobject 的选项:

{
  value: {
    avanced_value: true
  }
}

我试过像这样使用enum,但似乎bool 不能在枚举中使用。

#[derive(Deserialize)]
pub struct Config {
  value: ValueEnum
}

#[derive(Deserialize)]
pub enum ValueEnum {
  bool,
  Config(ValueConfig),
}

#[derive(Deserialize)]
pub struct ValueConfig {
  advanced_value: bool
}

我是否遗漏了一些明显的东西,或者我应该重新构建输入 json? 提前 Tnx。

【问题讨论】:

标签: json enums rust serde-json


【解决方案1】:

您没有将 bool 包装在枚举变体中(就像您使用 ValueConfig 所做的那样)。同样默认情况下,serde 标记枚举,这可能不是您想要的。您想使用未标记的枚举:

#[derive(Deserialize)]
pub struct Config {
  value: ValueEnum
}

#[derive(Deserialize)]
#[serde(untagged)]
pub enum ValueEnum {
  Bool(bool),
  Config(ValueConfig),
}

#[derive(Deserialize)]
pub struct ValueConfig {
  advanced_value: bool
}

【讨论】:

  • 谢谢!我错过了 serde 的未标记选项。它现在正在工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
相关资源
最近更新 更多