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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:15:56