使用 Serde 反序列化时有没有办法允许未知的枚举标签? [复制]

2024-04-29

我正在反序列化一个标记的枚举:

#[derive(Deserialize)]
enum Foo {
    A(A),
    B(B),
    C(C),
}

如果 Serde 遇到一个不存在的标签A, B or C,那么就会抛出错误。有没有办法为未知标签添加包罗万象的变体?如果它只记录标签我会很高兴:

#[derive(Deserialize)]
enum Foo {
    A(A),
    B(B),
    C(C),
    #[serde(unknown_tag)]
    Unknown(String),
}

您可以使用未标记的枚举 https://serde.rs/enum-representations.html#untagged为了这。详细信息取决于您具体想要做什么。想法是包装Foo into a MaybeFoo, where MaybeFoo有一个“通用”类型可以反序列化为第二选择。

在下面的示例中,我们使用serde_json::Value https://docs.rs/serde_json/1.0.57/serde_json/enum.Value.html作为虚拟类型,作为其实现Deserialize是通用的,因为可以反序列化任何有效的 JSON。如果您的源格式不同,您可能需要不同的解串器或实现Deserialize你自己。

#[derive(serde::Deserialize, serde::Serialize, PartialEq, Debug)]
enum Foo {
  A(u64),
  B(f32),
  C(String),
}

// MaybeFoo is untagged, which also means it "looks" exactly
// like a Foo when serialized/deserialized. 
#[derive(serde::Deserialize, PartialEq, Debug)]
#[serde(untagged)]
enum MaybeFoo {
    Foo(Foo),
    Other(serde_json::Value)
}

The MaybeFoo是一个“未标记”的枚举,Serde 将尝试反序列化MaybeFoo as a Foo并且 - 如果失败 - 作为serde_json::Value它总是会成功(如果源自 JSON)。

fn main() {
    // Lets create a Foo and serialize it
    let foo = Foo::B(0.0);
    let foo_json = serde_json::to_string(&foo).unwrap();
    println!("{}", &foo_json);

    // Deserialize works as expected
    let foo_json = "{\"B\":0.0}";
    assert!(serde_json::from_str::<Foo>(&foo_json).unwrap() == foo);

    // Deserializing as a `MaybeFoo` works as expected
    assert!(serde_json::from_str::<MaybeFoo>(&foo_json).unwrap() == MaybeFoo::Foo(foo));    

    // Deserializing something else is not a `Foo`!
    let foo_json = "{\"Unknown\":0.0}";
    let foo = serde_json::from_str::<MaybeFoo>(&foo_json).unwrap();

    // Prints "Other(Object({"Unknown": Number(0.0)}))"
    println!("{:?}", &foo);
}

您可以使用 serde_json 的 API 来检查未知变体 - 如果它看起来像地图 - 提取标签。如果这是您唯一的兴趣,则第二种变体MaybeFoo也可以是一个HashMap<String, serde::de::IgnoredAny>,这将反序列化任何地图,将标签记录为String并丢弃该值。然而,这假定未知值是标记值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Serde 反序列化时有没有办法允许未知的枚举标签? [复制] 的相关文章

随机推荐

  • Doxygen 在子目录中找不到标头

    我正在使用 Doxygen 记录 C 库的头文件 在里面Doxyfile 我定义 INPUT include 希望 Doxygen 能够为所有头文件生成文档include Foo 但事实并非如此 只有index html被生成 我可以设置I
  • 绘制从节点到空的箭头

    我想绘制一个美人鱼图 其中包含不与节点连接的箭头 graph LR A Sample Text gt A A gt B B gt A B gt gt A and B gt 失败 可能是因为箭头需要输入和输出节点 有解决方法吗 我可以使节点不
  • 设置样式缩放级别 openlayers 3

    在 Openlayers 中 可以根据缩放级别打开或关闭某些功能 尽管查看了文档 但我在 OpenLayers 3 中没有找到相同的功能 有谁知道如何做到这一点 这是我放置在地图上的功能ol style Text是我只想在用户放大到特定缩放
  • 运算符“&&”不能应用于“bool”和“System.Collections.Generic.IEnumerable”类型的操作数

    我正在尝试第一个过滤器列表 然后使用OrderBy但我收到以下错误Where clause 运算符 不能应用于 bool 类型的操作数并且 System Collections Generic IEnumerable 我的查询有什么问题吗
  • 使用 javascript 打开文件,客户端

    在我的应用程序中 我想打开客户端计算机上存在的文件 我创建了两个应用程序 桌面应用程序和 Web 应用程序 当用户安装桌面应用程序时 一些文件会被复制到其安装路径 我想通过 javascript 从我的 Web 应用程序打开这些文件 出于安
  • AngularJS:使用 $http.post 传递复杂的 json 数据

    我在使用 http post 在 angularjs 中传递复杂的 json 对象时遇到问题 我不断收到从服务器发回的 400 bad request 错误 表示该请求在语法上不正确 我相信它与数组有关 因为当我不包含它时它会很好地传递 我
  • 直接放置在 std::map 中

    为什么这段代码无法编译 std map
  • 有没有办法使用 iframe api 在暂停时隐藏相关的 Youtube 视频?

    我正在使用 iframe API 我想在页面上嵌入一些视频 但我不想在用户暂停视频时显示相关视频 我知道 2018 年 9 月之后 Youtube 取消了在结束或暂停视频时隐藏相关视频的可能性 我知道参数 rel 0 现在显示来自视频上传者
  • Android 检测 Kitkat 的 USB 存储 (4.4)

    我创建了一个 webview 应用程序 它在资产目录中的应用程序内托管一个网站 我想通过插入我的平板电脑 USB 插槽的 U 盘来更新网站 我首先尝试使用 MEDIA MOUNTED 广播 该广播不适用于我的 android 4 4 药片
  • Android SQLite 列.....不是唯一的

    我在 Android 上使用 SQLite 并收到此错误 02 11 18 05 37 224 E SQLiteDatabase 26583 android database sqlite SQLiteConstraintException
  • 添加覆盖 twinx 轴线条的图例

    我有这个Python代码 它与轴成对ax并在两个轴上绘制一些函数 我将图例绘制在ax1 问题是图例没有覆盖曲线ax2 有可能自动定位传说中的ax通过覆盖线ax2 请注意 在fig legend选项loc best 不可用 我需要在绘图区域内
  • 最长和最短的 HTML 字符实体名称是什么? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 管子周围有
  • Python C api - 函数重载

    我有许多接受不同参数的 C 函数 例如 foo i int a foo c char c 是否可以在 python C api 中重载这些函数 我尝试使用以下方法表 static PyMethodDef test methods foo P
  • 如何在“nodejs”中查找请求参数

    当我向nodejs服务器发送请求时 当请求发送到nodejs服务器时 我们如何找到请求查询中发送的参数 req param req params req query 所有给予未定义 也当我stringify req请求它给出错误 Conve
  • 如何使用apache poi读取Excel文件中的多行和多列?

    我想读取附加的 excel 文件 使用 Apache POI 在匹配问题类型 滑块后 想要传递相应类的值 根据问题类型创建不同的类 https i stack imgur com PRbo5 png 使用 Fillo Java Jar 它非
  • 如何构建 Boost::program_options

    我想使用 boost program options 安装boost后 我认为我必须单独构建program options http www boost org doc libs 1 43 0 more getting started wi
  • 在 pymssql 中重复死锁查询后更新失败

    我将 SQL Server 与 pymssql 一起使用 发现一个特别复杂的 SELECT 查询偶尔会被选为死锁受害者 因此 我将其包装在 while 循环中 以便在发生这种情况时重试事务 大致如下 while True try curso
  • PostgreSQL - 添加组角色后密码身份验证失败

    我对 PostgreSQL 还很陌生 我花了整个上午的时间试图让用户登录正常工作 现在我感到非常沮丧 因此 我有一个 PostGIS 数据库 版本 9 2 作为 OpenGeo 软件套件的一部分 我可以使用 postgres 用户访问数据库
  • 为什么 Visual Studio 只允许项目中的每个文件有一个链接?

    我希望在一个解决方案的多个不同项目中拥有一个文件 但是 Visual Studio 只允许每个解决方案有一个到该文件的链接 有办法解决这个问题吗 VS 项目中的单个文件有多个软链接会出现什么问题 Update 我已经添加了下面评论中所述的链
  • 使用 Serde 反序列化时有没有办法允许未知的枚举标签? [复制]

    这个问题在这里已经有答案了 我正在反序列化一个标记的枚举 derive Deserialize enum Foo A A B B C C 如果 Serde 遇到一个不存在的标签A B or C 那么就会抛出错误 有没有办法为未知标签添加包罗