如何用Rust完整读取Msgpack文件并转换为JSON文件?
解决Rust中完整读取Msgpack文件并转换为JSON的问题
你的代码只读取第一个元素是因为serde_transcode::transcode仅完成单次反序列化-序列化操作,只会处理Msgpack流中的第一个值。要完整读取所有元素,需要循环读取Msgpack中的每个值,逐个转换为JSON并组织成合法的JSON数组。
下面是修改后的代码,实现完整读取并输出合法JSON:
use std::fs::File; use std::io::{BufReader, BufWriter, Write}; use serde::de::Deserialize; use rmp_serde::Deserializer; use serde_json::Serializer; fn main() -> Result<(), Box<dyn std::error::Error>> { let input_path = "./src/foo.msgpack"; let output_path = "./src/results.json"; let reader = BufReader::new(File::open(input_path)?); let mut writer = BufWriter::new(File::create(output_path)?); let mut deserializer = Deserializer::from_read(reader); let mut serializer = Serializer::pretty(&mut writer); // 写入JSON数组的开头 writer.write_all(b"[")?; let mut first_element = true; loop { // 尝试反序列化下一个Msgpack值,使用serde的通用Value类型 match serde_json::Value::deserialize(&mut deserializer) { Ok(value) => { if !first_element { // 非第一个元素前写入逗号分隔 writer.write_all(b",")?; // 换行保持JSON格式美观 writer.write_all(b"\n")?; } first_element = false; // 将单个值序列化为JSON value.serialize(&mut serializer)?; } Err(e) => { // 捕获EOF错误,说明所有元素已读取完毕 if e.is_eof() { break; } else { return Err(e.into()); } } } } // 写入JSON数组的结尾并刷新缓冲区 writer.write_all(b"\n]")?; writer.flush()?; Ok(()) }
关键说明:
- 使用
serde_json::Value作为通用类型接收Msgpack反序列化后的值,兼容大多数Msgpack数据类型。 - 手动管理JSON数组结构:先写
[,元素间用逗号分隔,最后写],确保输出为合法JSON。 - 循环调用
deserialize逐个读取Msgpack流元素,直到遇到EOF错误(表示文件读取完毕)。 - 错误处理区分EOF和其他反序列化错误,避免误报。
确保你的Cargo.toml包含必要依赖:
[dependencies] serde = { version = "1.0", features = ["derive"] } rmp-serde = "1.1" serde_json = "1.0"
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

