总结
我正在用rust写一个程序,我更喜欢用TOML文件来存储struct
的矢量。但是我不知道如何在TOML文件中存储struct
的矢量。我可以用JSON来做这件事,但是我希望使用TOML,所以只是确认我没有忽略什么(甚至不确定TOML格式是否能够支持我所需要的)。因此,我试图找出是否有人知道一种方法,使用rust将struct
的向量序列化为TOML,更重要的是将其反序列化回向量。
错误消息(尝试反序列化时)
线程'main'在Err
值上调用Result::unwrap()
时死机:错误{内部:错误内部{类型:通缉犯{预期:“一个表键”,找到:“一个右括号”},行:点(0),col:2、at:有的(2)、留言:“",密钥:[] }}',源代码/主文件。rs:22:55注意:使用RUST_BACKTRACE=1
环境变量运行以显示回溯
摘录自Cargo.toml
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1.0.86"
toml = "0.5.9"
示例代码
链接到Playground上的代码
use serde::{Deserialize, Serialize};
# [derive(PartialEq, Debug, Serialize, Deserialize)]
struct Point {
x: i32,
}
/// An ordered list of points (This is what I want to store in the TOML file)
type Points = Vec<Point>;
fn main(){
// Create sample data to test on
let original: Points = vec![Point { x: 1 }];
// Working code that converts it to json and back
let json = serde_json::to_string(&original).unwrap();
let reconstructed: Points = serde_json::from_str(&json).unwrap();
assert_eq!(original, reconstructed); // No panic
// "Desired" code that converts it to toml but unable to deserialize
let toml = toml::to_string(&original).unwrap();
let reconstructed: Points = toml::from_str(&toml).unwrap(); // Panics!
assert_eq!(original, reconstructed);
}
toml::to_string(&original).unwrap()
的输出
[[]]
x = 1
示例代码说明
在示例代码中,我创建了一些示例数据,然后将其转换为JSON,然后再转换回来,没有任何问题。它不会给予错误,但输出对我来说没有意义。然后我试着把它转换回一个rust向量,这就触发了错误。我最大的问题是我'我甚至不确定TOML文件将如何查找具有多个struct
的向量的有效表示。
相关问题/研究
我找不到任何信息来创建一个有多个struct
的向量,我能找到的最接近的是this question,虽然这个问题看起来应该能解决我的问题,但实际的问题是序列化枚举,因此解决方案引用了这个问题,并没有解决我的问题。
1条答案
按热度按时间gojuced71#
在Toml中表示表数组的语法似乎是
因此,从Toml语法和原始死机错误
Error { inner: ErrorInner { kind: Wanted { expected: "a table key", found: "a right bracket" }
回溯:引入一个表示表键的 Package 结构可以解决这个问题。