rust Json文件序列化和反序列化

pinkon5k  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(168)

我有一个json文件:

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

我想将User结构的对象从它读入一个数组,然后向该数组添加另一个元素,并将所有内容重写到同一个文件中。
我的代码:

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);
    
}

启动时出现错误:
线程"main"在"对Err值调用Result::unwrap()"时死机:错误("访问被拒绝。(操作系统错误5)",行:0,列:0)',源\主. rs:22:34
注意:使用RUST_BACKTRACE=1环境变量运行以显示回溯
错误:进程没有成功退出:target\debug\json.exe(退出代码:101段)。
我该怎么办?

juud5qan

juud5qan1#

正如@Caesar在评论中指出的,您应该改变打开文件的方式。

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

你应该写上:

let mut f = File::options()
    .read(true)
    .write(true)
    .open("info.json")
    .unwrap();

但是当你读文件的时候,你在文件中的位置会移动,所以在写文件之前(因为你想重写它,而不是追加),你需要重新设置位置:

let _ = f.seek(std::io::SeekFrom::Start(0)).unwrap();

就在以下行之前:

serde_json::to_writer(f, &q).unwrap();

相关问题