简体   繁体   English

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

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

I'm trying to deserialize an array of objects.我正在尝试反序列化一组对象。 The current code that's doing that is:当前执行此操作的代码是:

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

But it's returning this error:但它返回此错误:

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: [] } }'

I have this TOML file:我有这个 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."

For this struct:对于这个结构:

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

Everywhere I look I expect [[job]] to be a vector.在我所看到的任何地方,我都希望[[job]]是一个向量。 But why is it bein treated like a map?但为什么它被当作 map 对待?

The issue isn't the capitalization.问题不在于大小写。

This is what your TOML would look like if it were JSON:如果它是 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."
    }
  ]
}

Now it's a bit more obvious why this should be deserialized into an object with a single key "job" .现在更明显了,为什么应该将其反序列化为具有单个键"job"的 object 。

You can try to run this code:您可以尝试运行此代码:

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:?}");
}

What gets printed is:打印出来的是:

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

In the toml crate a Table is defined as:toml crate 中, Table定义为:

type Table = Map<String, Value>;

Also from the docs:同样来自文档:

By default it is backed by a BTreeMap, enable the preserve_order feature to use a LinkedHashMap instead.默认情况下,它由 BTreeMap 支持,启用 preserve_order 功能以改用 LinkedHashMap。

So Table is pretty much like a "map" or "object".所以Table很像一个“地图”或“对象”。

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

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