繁体   English   中英

如何将对象数组从 TOML 反序列化为 Rust?

[英]How do I deserialize an array of objects from TOML to Rust?

我正在尝试反序列化一组对象。 当前执行此操作的代码是:

let jobs: Vec<Job> = toml::from_str(include_str!("../../assets/job.toml"))
    .expect("Default job not loading");

但它返回此错误:

thread 'main' panicked at 'Default job not loading: Error { inner: ErrorInner { kind: Custom, line: Some(6), col: 0, at: Some(556), message: "invalid type: map, expected a sequence", key: [] } }'

我有这个 TOML 文件:

[[job]]
title = "Lorem"
company = "Ipsum"
description = "Praesent fermentum, nulla eu vehicula dapibus, sapien ipsum tincidunt felis, a pharetra nibh purus vel lacus. Suspendisse lectus leo, vestibulum eget ligula ut, facilisis porttitor odio. Morbi egestas lacinia nisi, sed ornare arcu iaculis sed. Ut tempor condimentum mattis. Quisque auctor scelerisque purus. Donec tincidunt sagittis sapien. Ut ac malesuada est, in condimentum ex. Curabitur in sapien non elit sagittis imperdiet at eget lectus."
[[job]]
title = "Lorem"
company = "Ipsum"
description = "Praesent fermentum, nulla eu vehicula dapibus, sapien ipsum tincidunt felis, a pharetra nibh purus vel lacus. Suspendisse lectus leo, vestibulum eget ligula ut, facilisis porttitor odio. Morbi egestas lacinia nisi, sed ornare arcu iaculis sed. Ut tempor condimentum mattis. Quisque auctor scelerisque purus. Donec tincidunt sagittis sapien. Ut ac malesuada est, in condimentum ex. Curabitur in sapien non elit sagittis imperdiet at eget lectus."

对于这个结构:

#[derive(Debug, Deserialize)]
pub struct Job {
    pub title: String,
    pub company: String,
    pub description: String,
    // shortened for example
}

在我所看到的任何地方,我都希望[[job]]是一个向量。 但为什么它被当作 map 对待?

问题不在于大小写。

如果它是 JSON,这就是您的 TOML 的样子:

{
  "job": [
    {
      "title": "Lorem",
      "company": "Ipsum",
      "description": "Praesent fermentum, nulla eu vehicula dapibus, sapien ipsum tincidunt felis, a pharetra nibh purus vel lacus. Suspendisse lectus leo, vestibulum eget ligula ut, facilisis porttitor odio. Morbi egestas lacinia nisi, sed ornare arcu iaculis sed. Ut tempor condimentum mattis. Quisque auctor scelerisque purus. Donec tincidunt sagittis sapien. Ut ac malesuada est, in condimentum ex. Curabitur in sapien non elit sagittis imperdiet at eget lectus."
    },
    {
      "title": "Lorem",
      "company": "Ipsum",
      "description": "Praesent fermentum, nulla eu vehicula dapibus, sapien ipsum tincidunt felis, a pharetra nibh purus vel lacus. Suspendisse lectus leo, vestibulum eget ligula ut, facilisis porttitor odio. Morbi egestas lacinia nisi, sed ornare arcu iaculis sed. Ut tempor condimentum mattis. Quisque auctor scelerisque purus. Donec tincidunt sagittis sapien. Ut ac malesuada est, in condimentum ex. Curabitur in sapien non elit sagittis imperdiet at eget lectus."
    }
  ]
}

现在更明显了,为什么应该将其反序列化为具有单个键"job"的 object 。

您可以尝试运行此代码:

use toml::Value;
pub fn main() {
    let s = "
        [[job]]
        title = \"Lorem\"
        company = \"Ipsum\"
        description = \"abcd\"
        [[job]]
        title = \"Lorem\"
        company = \"Ipsum\"
        description = \"abcd\"
        ";
    let v = s.parse::<Value>().unwrap();
    println!("{v:?}");
}

打印出来的是:

Table({"job": Array([Table({"company": String("Ipsum"), "description": String("abcd"), "title": String("Lorem")}), Table({"company": String("Ipsum"), "description": String("abcd"), "title": String("Lorem")})])})

toml crate 中, Table定义为:

type Table = Map<String, Value>;

同样来自文档:

默认情况下,它由 BTreeMap 支持,启用 preserve_order 功能以改用 LinkedHashMap。

所以Table很像一个“地图”或“对象”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM