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

Rust中JSON序列化反序列化报错:Access denied(os error 5)求助

问题:读取JSON并写入时出现权限错误?

我有如下JSON文件:

[
    {
        "name": "John",
        "sirname": "Fogerty",
        "age": 77
    },
    {
        "name": "Dave",
        "sirname": "Mustaine",
        "age": 61
    }
]

希望将其中的对象读取为User结构体数组,添加一个新元素后写回原文件。我的Rust代码如下:

use serde_derive::{Serialize, Deserialize};
use serde_json::json;
use std::fs::File;

#[derive(Serialize, Deserialize, Debug)]
struct User {
    name: String,
    sirname: String,
    age: u8,
}

fn main() {
    let f = File::open("info.json").unwrap();

    let mut q: Vec<User> = serde_json::from_reader(&f).unwrap();
    q.push(User{name: "Daniil".to_string(),
        sirname: "Volkov".to_string(),
        age: 19,
    });

    serde_json::to_writer(f, &q).unwrap();
    println!("{:?}", q);
    
}

运行时出现错误:

thread 'main' panicked at 'called Result::unwrap() on an Err value: Error("Access denied. (os error 5)", line: 0, column: 0)', src\main.rs:22:34
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
error: process didn't exit successfully: target\debug\json.exe (exit code: 101).


解决方法

这个权限错误的核心原因是:File::open默认以只读模式打开文件,之后你尝试用同一个文件句柄写入,系统会拒绝这个操作。另外就算权限允许,读取完成后文件指针已经移到末尾,直接写入也会导致内容追加而非覆盖,不符合需求。

推荐用更简洁的方式处理文件读写:先读取整个文件内容,解析后关闭文件,再重新写入。修改后的代码如下:

use serde_derive::{Serialize, Deserialize};
use std::fs;

#[derive(Serialize, Deserialize, Debug)]
struct User {
    name: String,
    sirname: String,
    age: u8,
}

fn main() {
    // 读取文件内容到字符串
    let content = fs::read_to_string("info.json").unwrap();
    // 解析为User数组
    let mut users: Vec<User> = serde_json::from_str(&content).unwrap();
    
    // 添加新用户
    users.push(User {
        name: "Daniil".to_string(),
        sirname: "Volkov".to_string(),
        age: 19,
    });
    
    // 生成格式化的JSON字符串(保持原文件的可读性)
    let new_content = serde_json::to_string_pretty(&users).unwrap();
    // 写入原文件,自动覆盖内容
    fs::write("info.json", new_content).unwrap();
    
    println!("{:?}", users);
}

修改说明:

  1. 使用fs::read_to_string一次性读取文件内容,避免手动管理文件句柄
  2. 用serde_json::from_str从字符串解析JSON,替代from_reader
  3. serde_json::to_string_pretty生成带缩进的JSON,和原文件格式一致,方便查看
  4. fs::write会自动以写入模式打开文件,覆盖原有内容,无需手动处理文件打开权限

内容的提问来源于stack exchange,提问作者Daniil Ubica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:45:34