Rust中如何按文件原始顺序读取TOML表?
如何让Rust的toml crate保持TOML文件的表键顺序
问题场景
我用以下Rust代码解析TOML文件:
let toml_content: Value = contents.parse::<toml::Value>().unwrap(); for key in toml_content.as_table().unwrap().keys() { println!("{:?}", key); }
执行后输出:
"Community" "Person" "Wallet"
但我期望输出顺序和TOML文件中的一致:
"Person" "Wallet" "Community"
我的TOML文件内容如下:
[Person] name = "str" age = "u8" ttl = "u8" wallet = "Wallet" [Wallet] owner = "Person" balance = "f64" [Community] name = "str" members = ["Person"]
问题原因
toml crate默认使用的toml::Value::Table基于HashMap实现,不会保留键的原始插入顺序(即TOML文件里的定义顺序),遍历输出时会按哈希值排序,导致顺序错乱。
解决方法
要保留TOML文件的原始顺序,需启用toml crate的preserve_order特性,使用有序表结构:
1. 修改依赖配置
在Cargo.toml中启用preserve_order特性:
[dependencies] toml = { version = "0.8", features = ["preserve_order"] }
(版本号可根据实际使用情况调整,确保对应版本支持该特性)
2. 调整代码实现
有两种可行的写法:
- 写法一:直接解析为有序Map
use toml::map::Map; use toml::Value; // 解析为有序表结构 let toml_map: Map<String, Value> = contents.parse().unwrap(); // 按原始顺序遍历键 for key in toml_map.keys() { println!("{:?}", key); }
- 写法二:通过Value获取有序表
let toml_content: Value = contents.parse::<toml::Value>().unwrap(); // 获取有序表引用 let ordered_table = toml_content.as_table_ordered().unwrap(); for key in ordered_table.keys() { println!("{:?}", key); }
修改后执行代码,输出顺序就会和TOML文件中的原始定义顺序完全一致。
内容的提问来源于stack exchange,提问作者Muhammad Ikhwan Perwira
相关产品推荐
相关产品推荐

