2

取以下 TOML 数据:

[[items]]
foo = 10
bar = 100

[[items]]
foo = 12
bar = 144

以及以下锈代码:

use serde_derive::Deserialize;
use toml::from_str;
use toml::value::Table;

#[derive(Deserialize)]
struct Item {
    foo: String,
    bar: String
}

fn main() {
    let items_string: &str = "[[items]]\nfoo = 10\nbar = 100\n\n[[items]]\nfoo = 12\nbar = 144\n";
    let items_table: Table = from_str(items_string).unwrap();
    let items: Vec<Item> = items_table["items"].as_array().unwrap().to_vec();
    // Uncomment this line to print the table
    // println!("{:?}", items_table);
}

正如您自己看到的那样,该程序无法编译,并返回此错误:

预期结构Item,找到枚举toml::value::Value

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

4

1 回答 1

4

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

在您的情况下,这意味着 TOMLTable类型不知道您的Item类型,也无法让您知道它。

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

use serde_derive::Deserialize;
use std::collections::HashMap;
use toml::from_str;

#[derive(Deserialize, Debug)]
struct Item {
    foo: u64,
    bar: u64,
}

fn main() {
    let items_string: &str = "[[items]]\nfoo = 10\nbar = 100\n\n[[items]]\nfoo = 12\nbar = 144\n";
    let items_table: HashMap<String, Vec<Item>> = from_str(items_string).unwrap();
    let items: &[Item] = &items_table["items"];

    println!("{:?}", items_table);
    println!("{:?}", items);
}

永久链接到操场

于 2020-03-08T22:22:33.027 回答