You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:54:59