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 anErrvalue: Error("Access denied. (os error 5)", line: 0, column: 0)', src\main.rs:22:34
note: run withRUST_BACKTRACE=1environment 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); }
修改说明:
- 使用
fs::read_to_string一次性读取文件内容,避免手动管理文件句柄 - 用
serde_json::from_str从字符串解析JSON,替代from_reader serde_json::to_string_pretty生成带缩进的JSON,和原文件格式一致,方便查看fs::write会自动以写入模式打开文件,覆盖原有内容,无需手动处理文件打开权限
内容的提问来源于stack exchange,提问作者Daniil Ubica
相关产品推荐
相关产品推荐

