【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化

news2024/11/25 0:43:28

说在前面

  • rust新手,egui没啥找到啥教程,这里自己记录下学习过程
  • 环境:windows11 22H2
  • rust版本:rustc 1.71.1
  • egui版本:0.22.0
  • eframe版本:0.22.0
  • 上一篇:这里

rfd-Rusty File Dialogs

  • 一个跨平台的本地文件选择库,支持的平台:
    • Windows
    • macOS
    • Linux & BSDs (GTK3 or XDG Desktop Portal)
    • WASM32 (async only)
  • 让我们来看看使用:
    if ui.button("open file").clicked() {
    	if let Some(path) = rfd::FileDialog::new().pick_file() {
        	self.picked_path = Some(path.display().to_string());
        }
    }
    
    在这里插入图片描述
  • 还可以添加文件后缀筛选:
    if ui.button("open file").clicked() {
    	if let Some(path) = rfd::FileDialog::new().add_filter("text", &["txt", "rs"]).pick_file() {
        	self.picked_path = Some(path.display().to_string());
        }
    }
    
    在这里插入图片描述
  • 有了文件路径之后,我们就可以通过标准的文件库进行读写了

serde_json

  • json序列化与反序列化库

  • 在之前的文章中我们已经初步接触了serde相关知识,这里我们来看看其他内容

  • 在我们获取到文件路径后,我们就可以读取json文件了,同时,对于比较大的文件,serde_json也提供了from_reader的方法:

    use serde::Deserialize;
    
    use std::error::Error;
    use std::fs::File;
    use std::io::BufReader;
    use std::path::Path;
    
    #[derive(Deserialize, Debug)]
    struct User {
        fingerprint: String,
        location: String,
    }
    
    fn read_user_from_file<P: AsRef<Path>>(path: P) -> Result<User, Box<dyn Error>> {
        // 使用只读方式读取文件 并使用buffer存储
        let file = File::open(path)?;
        let reader = BufReader::new(file);
    
        // 反序列化json数据
        let u = serde_json::from_reader(reader)?;
    
        // 返回
        Ok(u)
    }
    
    fn main() {
        let u = read_user_from_file("test.json").unwrap();
        println!("{:#?}", u);
    }
    
  • 在我们的例子中,首先定义下结构体:

    #[derive(serde::Deserialize, serde::Serialize)]
    pub struct WorkSpace {
        pub name: String,
        pub path: String,
        pub description: String,
        pub data: Project,
    }
    
    #[derive(serde::Deserialize, serde::Serialize)]
    pub struct Project {
        version: String,
        scope: String,
        selected_tree: String,
    }
    
  • 然后是初始化代码:

    impl WorkSpace {
        pub fn new(path: String) -> Self {
             Self::from_file(path).unwrap()
        }
        fn from_file<P: AsRef<Path>>(path: P) -> Result<WorkSpace, Box<dyn Error>> {
            // 使用只读方式读取文件 并使用buffer存储
            let file = File::open(path)?;
            let reader = BufReader::new(file);
    
            let u = serde_json::from_reader(reader)?;
    
            Ok(u)
        }
    }
    
  • 我们的json数据如下:

    {
    	"name": "test",
    	"path": "C:\\Users\\b3.txt",
    	"description": null,
    	"data": {
    		"version": "0.0.1",
    		"scope": "project",
    		"selectedTree": "045b5abc-aef7-4909-8d16-5797ebb270e9",
    	}
    }
    
  • 运行我们的代码,选择json文件,发现报错了:

    thread 'main' panicked at 
    'called `Result::unwrap()` on an `Err` value: Error("invalid type: null, expected a string", line: xxx, column: 17)',
     src\project.rs:18:32
    

    这是因为对于WorkSpace.description,我们定义的String类型,但是我们的json数据中却是null,匹配不上,要解决这个问题,我们可以这样:

    #[derive(serde::Deserialize, serde::Serialize)]
    pub struct WorkSpace {
        pub name: String,
        pub path: String,
        pub description: serde_json::Value,
        pub data: Project,
    }
    

    description修改为枚举Value

    pub enum Value {
        Null,
        Bool(bool),
        Number(Number),
        String(String),
        Array(Vec<Value>),
        Object(Map<String, Value>),
    }
    
  • 再次运行代码,发现又报错了:

    thread 'main' panicked at 
    'called `Result::unwrap()` on an `Err` value: Error("missing field `selected_tree`", line: 245515, column: 2)',
    src\project.rs:18:32
    

    这是因为Project.selected_tree的默认反序列化名称为selected_tree,而在我们的json数据中为selectedTree,这时我们可以这样处理:

    #[derive(serde::Deserialize, serde::Serialize)]
    pub struct Project {
        version: String,
        scope: String,
    
        #[serde(rename(serialize = "selectedTree", deserialize = "selectedTree"))]
        selected_tree: String,
    }
    

    这样就可以指定序列化与反序列化时的名称为selectedTree

  • 然后我们来试试序列化并保存文件,同样可以使用I/O stream

    pub fn to_file<P: AsRef<Path>>(&self, path: P) -> Result<(), serde_json::Error> {
        let file = File::options().create_new(true).write(true).open(path).unwrap();
    
        let writer = BufWriter::new(file);
    
        serde_json::to_writer_pretty(writer, self)
    }
    

参考

  • rfd
  • serde_json
  • serde

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

只需3步部署Django项目到Kubernetes上

1. 目标 本文讲述了如何通过3步&#xff0c;把Django项目部署在K8S上。 本文适用读者&#xff1a; 了解Django项目的开发。了解K8S的用途。 2. 具体步骤 把一个Django项目部署在Kubernete环境上&#xff0c;只需以下3步&#xff1a; 创建镜像部署在Kubernetes环境上配置MyS…

linux命令查看谁在使用服务器的GPU

命令&#xff1a;查看GPU使用情况 nvidia-smi 可以知悉GPU占用情况和主要使用GPU的进程&#xff0c;如下图所示&#xff1a; 实时查看gpu使用&#xff1a; nvidia-smi -l 1 表示每隔1s刷新一下&#xff0c;数字可更改。 查看进程的归属者 方法一&#xff1a;ps -f -p pid…

360极速浏览器X终极奥义之——更改划词工具条的搜索为百度搜索 2023更新版

原文为2019版本&#xff0c;具体已失效&#xff0c;2023更新。 1.需要将 https://www.so.com/s?q%s&src360csex_zoned字符串对应的十六进制码替换为 https://www.baidu.com/s?wd%s&src360csex_z对应的十六进制码。 2.需要删除后面的"oned"以保证转换出来…

冒泡排序~

1、对应长度len 数组&#xff0c;需要进行 len -1 趟冒泡&#xff0c;每趟冒泡&#xff0c;将最大&#xff08;小&#xff09;元素排列到最后无序位置 2、每趟冒泡从第一个元素开始&#xff0c;邻近两两比较&#xff0c;找出最大元素 每一趟冒泡&#xff0c;都进行元素交换&am…

基于频谱信息的图像去噪与恢复——使用约束最小二乘方滤波法

大家好&#xff0c;我是带我去滑雪&#xff01; 随着科学技术的不断发展&#xff0c;信息的交流和获取已不再受到时空的限制&#xff0c;已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体&#xff0c;起着不可替代的作用。频谱图像去噪复原方法是一种…

Hive【Hive(一)DDL】

前置准备 需要启动 Hadoop 集群&#xff0c;因为我们 Hive 是在 Hadoop 集群之上运行的。 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程。 Hive DDL 数据定义语言 1、数据库&#xff08;database&#xff09; 创建数据库 c…

YOLOv8『小目标』检测指南

前言 目前博主课题组在进行物体部件的异常检测项目&#xff0c;项目中需要先使用 YOLOv8 进行目标检测&#xff0c;然后进行图像切割&#xff0c;最后采用 WinCLIP 模型 进行部件异常检测 但是在实际操作过程中出现问题&#xff0c; YOLOv8 模型目标检测在大目标精确度不错&a…

Vue的详细教程--入门

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Vue是什么 二. Vue的特点及优势 三.使用…

IT运维:利用数据分析平台采集Windows event log数据

概述 本文将介绍如何借助Winlogbeat和Vector在鸿鹄里采集Windows event log数据&#xff0c;使技术人员能够在鸿鹄里更便捷和高效地分析Windows event log数据。 操作步骤 Winlogbeat是一个开源的日志数据采集器&#xff0c;专门用于采集Windows操作系统中的event log数据。它可…

【JAVA数据结构】包装类与认识泛型

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

解决 Cannot read property ‘key‘ of undefined

目录 问题解决1解决2最终 问题 现场环境分页查询某些条件项查询时&#xff0c;分页接口获取成功但是数据不渲染&#xff0c;页面像是卡住了&#xff1a; 报错 Cannot read property key of undefined 解决1 有人说 使用的el-pagination在格式化代码的时候layout属性的参数会多加…

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念 开始之前&#xff0c;我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一&#xff0c;vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上&#xff0c;…

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的&#xff0c;然后又刚好会一点点 go&#xff0c;就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…

堡垒机的相关介绍

描述 堡垒机&#xff0c;即在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为&#xff0c;以便集中报警、及时处理及审…

javafx学习记录

1.布局 2.选择重写或实现方法&#xff08;select methods to override/implements&#xff09; ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…

Leetcode 剑指Offer

求 12...n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例 1&#xff1a; 输入: n 3 输出: 6示例 2&#xff1a; 输入: n 9 输出: 45 一、信息 1.求一个等差数列的求和 2.要求不能使…

dubbo3 遇坑小结

最近给一个dubbo3的应用改名字&#xff0c;发现消费者还是会请求以前的地址。 问题现象 应用部署是k8s容器环境&#xff0c;dubbo版本是3.1.1&#xff0c;应用appA名字改成appB。改完名发现消费者应用appC请求还是会往以前的地址请求(当然是请求不通的) 问题分析 分析日志 d…

算法|Day52 单调栈3

LeetCode 84.柱状图中最大的矩形 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状…

【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

文章目录 题目方法一&#xff1a;常规做法 一次一次截取再做比较方法二&#xff1a;KMP匹配算法 题目 方法一&#xff1a;常规做法 一次一次截取再做比较 class Solution {public int strStr(String haystack, String needle) {int haylen haystack.length();int neelen need…

【二叉树】的顺序存储(堆的实现)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…