Rust 如何反序列化包含表数组的TOML表

Rust 如何反序列化包含表数组的TOML表,rust,toml,Rust,Toml,获取以下TOML数据: [[items]] foo = 10 bar = 100 [[items]] foo = 12 bar = 144 以及以下防锈代码: 使用serde_派生::反序列化; 使用toml::from_str; 使用toml::value::Table; [衍生产品系列化] 结构项{ 傅:字符串, 酒吧:字符串 } fn干线{ let items_string:&str=[[items]]\nfo=10\nbar=100\n\n[[items]]\nfo=12\nbar=

获取以下TOML数据:

[[items]]
foo = 10
bar = 100

[[items]]
foo = 12
bar = 144
以及以下防锈代码:

使用serde_派生::反序列化; 使用toml::from_str; 使用toml::value::Table; [衍生产品系列化] 结构项{ 傅:字符串, 酒吧:字符串 } fn干线{ let items_string:&str=[[items]]\nfo=10\nbar=100\n\n[[items]]\nfo=12\nbar=144\n; 让项目\u table:table=from\u stritems\u string.unwrap; let items:Vec=items\u table[items].as\u array.unwrap.to\u Vec; //取消对此行的注释以打印表格 //println!{:?},表项; } 正如您自己所看到的,程序返回此错误:

应为结构项,找到枚举toml::value::value


我理解它的含义,但我不知道如何解决这个问题并实现我首先想要做的事情:将父表的子数组强制转换为结构数组,而不是表数组。

您可以解析为预定义的TOML类型,例如table,但这些类型不知道预定义类型之外的类型。这些类型通常在数据的实际类型未知或不重要时使用

在您的情况下,这意味着TOML表类型不知道您的项类型,并且不能让它知道

但是,您可以轻松地解析为不同的类型:

使用serde_派生::反序列化; 使用std::collections::HashMap; 使用toml::from_str; [deriveDeserialize,Debug] 结构项{ foo:u64, 酒吧:u64, } fn干线{ let items_string:&str=[[items]]\nfo=10\nbar=100\n\n[[items]]\nfo=12\nbar=144\n; let items_table:HashMap=from_stritems_string.unwrap; let items:&[Item]=&items_表[items]; println!{:?},表项; println!{:?},项; }

您可以解析为预定义的TOML类型,例如Table,但这些类型不知道预定义类型之外的类型。这些类型通常在数据的实际类型未知或不重要时使用

在您的情况下,这意味着TOML表类型不知道您的项类型,并且不能让它知道

但是,您可以轻松地解析为不同的类型:

使用serde_派生::反序列化; 使用std::collections::HashMap; 使用toml::from_str; [deriveDeserialize,Debug] 结构项{ foo:u64, 酒吧:u64, } fn干线{ let items_string:&str=[[items]]\nfo=10\nbar=100\n\n[[items]]\nfo=12\nbar=144\n; let items_table:HashMap=from_stritems_string.unwrap; let items:&[Item]=&items_表[items]; println!{:?},表项; println!{:?},项; }

我通常会这样做。@SvenMarnach这将取决于编译时是否知道键,这在问题中没有指定。这正是我需要的。我在编译时不知道表名!所以预定义的结构不起作用。。。从文档中看,这是否可能并不明显。我通常会这样做。@SvenMarnach这将取决于编译时是否知道键,而这在问题中没有指定。这正是我所需要的。我在编译时不知道表名!所以预定义的结构不起作用。。。从医生那里看不出这是否可行。