用rust反序列化具有多个可能值的JSON

问题描述

因此,我正在Rust中编写一个程序(这是我的新手),该程序读取json配置文件,并根据输入内容执行一些操作。我已经成功地使用serde_json解析了json。我想允许用户做的下一件事是能够指定一些高级选项,但是我不知道如何解析输入。 默认的json看起来像这样:

{
  value: true
}

直接将其解析为这样的结构:

#[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。

解决方法

您没有将布尔值包装在枚举变量中(就像使用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
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...