rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)

作者:咸甜适中日期:2025/11/18

主要功能实现:

  • 所有json中数字转为字符串,保持精度不变
  • 巨大值 直接存储为字符串:3355446515156151516158.55125184845684
  • 值为列表["egeggeg","gegeg",25.5] 存储为: ["egeggeg","gegeg","25.5"]
  • 值为字典{"name":"小小","age":26} 存储为: {"name":"小小","age":"26"}

在这里插入图片描述

代码

1use regex::Regex;
2use rusqlite::{Connection, Result, params};
3use serde_json::Value;
4use std::collections::HashMap;
5use std::error::Error;
6
7// 使用正则表达式将JSON中的数值类型转换为字符串类型
8fn convert_numbers_to_strings_with_regex(json_str: &str) -> Result<String, Box<dyn Error>> {
9    // 创建一个新的正则表达式,使用更简单的方法来匹配数值
10    let mut result = json_str.to_string();
11
12    // 首先处理对象中的数值:"key":数字
13    // 我们使用更简单的模式,匹配键值对中的数值部分
14    let re_obj_value = Regex::new(
15        r#"([^"]+)"\s*:\s*(-?(?:\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?))"#,
16    )?;
17    result = re_obj_value.replace_all(&result, r#"$1":"$2""#).to_string();
18
19    // 然后处理数组中的数值:[数字,...]
20    // 使用数组边界和逗号作为上下文,避免匹配到字符串中的数字
21    let re_arr_value = Regex::new(
22        r#"([\[\s,])\s*(-?(?:\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?))\s*([\],])"#,
23    )?;
24    result = re_arr_value.replace_all(&result, r#"$1"$2"$3"#).to_string();
25
26    Ok(result)
27}
28
29fn main() -> Result<(), Box<dyn Error>> {
30    let original_json_str = r#"
31        [
32            {
33                "name":"张三",
34                "as_name":"阿三",
35                "age":15.3200001,
36                "hobby":["足球",3.25,"羽毛球"],
37                "grade":{"语文":99999999999999999.999999999999999,"数学":96.44,"英语":"77.2511002"},
38                "membe":true
39            },
40            {
41            	"name":"李四",
42                "age":17,
43                "hobby":[3.2,"篮球",10.2555],
44                "grade":{"语文":99999999999999999999999999999999,"数学":0.000000000000222,"英语":94.67},
45                "membe":false
46            },
47            {
48            	"name":"王五",
49                "age":"5.25",
50                "hobby":[7.7,"3.222"],
51                "grade":{"语文":"999999999999999999999999999","数学":"0.000000000000222","英语":0},
52                "membe":false
53            }
54        ]
55    "#;
56
57    // 使用正则表达式将JSON中的数值转换为字符串
58    let converted_json_str = convert_numbers_to_strings_with_regex(original_json_str)?;
59
60    // 连接到 SQLite 数据库
61    let conn = Connection::open("tt.db")?;
62    // 创建表
63    create_db(&conn)?;
64    // 解析转换后的JSON字符串
65    let json_value: Value = serde_json::from_str(&converted_json_str)?;
66    parse_json_and_store_in_db(&conn, &json_value)?;
67    Ok(())
68}
69
70// 创建数据库表
71fn create_db(conn: &Connection) -> Result<()> {
72    conn.execute(
73        "CREATE TABLE IF NOT EXISTS test_table (
74            id INTEGER PRIMARY KEY AUTOINCREMENT,
75            name TEXT NOT NULL,
76            as_name TEXT,
77            age TEXT,
78            hobby TEXT,
79            grade TEXT,
80            membe TEXT
81        )",
82        [],
83    )?;
84    Ok(())
85}
86
87// 解析 json 并存入数据库
88fn parse_json_and_store_in_db(conn: &Connection, json_str: &Value) -> Result<(), Box<dyn Error>> {
89    if let Value::Array(arr) = json_str {                   // 获取json中的列表
90        for item in arr {                                        // 循环遍历列表
91            if let Value::Object(obj) = item {   // 获取json中的字典类型
92                let mut name = String::new();                // 不为空的字段
93                let mut as_name = None;                      // 可以为空的字段
94                let mut age = None;
95                let mut hobby = None;
96                let mut grade = None;
97                let mut membe = None;
98                for (key, value) in obj {            // 循环遍历字典中的键值对
99                    match key.as_str() {                                  // 匹配键值对中的键
100                        "name" => {                                       // 解析name字段
101                            if let Value::String(s) = value {  // 解析name字段为字符串
102                                name = s.clone();                         // 赋值给name变量
103                            }
104                        }
105                        "as_name" => {
106                            if let Value::String(s) = value {  
107                                as_name = Some(s.clone());           // 值可以为空的字符串
108                            }
109                        }
110                        "age" => {
111                            if let Value::String(s) = value {
112                                age = Some(s.clone());
113                            }
114                        }
115                        "hobby" => {
116                            if let Value::Array(a) = value {           // 解析hobby字段为列表
117                                let mut hobby_list = Vec::new();       // 用于存储解析后的hobby列表
118                                for v in a {                    // 循环遍历hobby列表中的元素
119                                    if let Value::String(s) = v {      // 解析hobby列表中的元素为字符串
120                                        hobby_list.push(s.clone());    // 列表元素添加到hobby_list中
121                                    }
122                                }
123                                hobby = Some(serde_json::to_string(&hobby_list)?);    // 将hobby_list转换为字符串并赋值给hobby变量
124                            }
125                        }
126                        "grade" => {
127                            if let Value::Object(o) = value {  // 解析grade字段为字典
128                                let mut grade_map = HashMap::new();                   // 用于存储解析后的grade字典
129                                for (k, v) in o {                              // 循环遍历grade字典中的键值对
130                                    if let Value::String(n) = v {                     // 解析grade字典中的值为字符串
131                                        grade_map.insert(k.clone(), n.clone());       // 字典键值对添加到grade_map中  
132                                    }
133                                }
134                                grade = Some(serde_json::to_string(&grade_map)?);     // 将grade_map转换为字符串并赋值给grade变量
135                            }
136                        }
137                        "membe" => {
138                            if let Value::Bool(b) = value {                    // 解析membe字段为布尔值
139                                membe = Some(b.to_string());                         // 将布尔值转换为字符串并赋值给membe变量
140                            }
141                        }
142                        _ => continue,  // 忽略其他字段
143                    }
144                }
145                conn.execute(
146                    "INSERT INTO test_table (name, as_name, age, hobby, grade, membe) VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
147                    params![name, as_name, age, hobby, grade, membe],
148                )?;
149            }
150        }
151    }
152    Ok(())
153}
154
155

rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)》 是转载文章,点击查看原文


相关推荐


利用CMDB数据实现指标业务维度的动态扩展
可观测性用观测云2025/11/17

背景 很多客户已经建有 Prometheus/Zabbix 等采集方式,通常不会贸然替换 DataKit 进行直采,往往是通过 DataKit 去获取其它工具采集的结果。如 Prometheus remote write,Zabbix export 等。 为了增加不同数据类型的关联性,需要对已有的指标数据添加更多业务 TAG,如应用名,所属项目,部门等。为实现此类需求,需要能够获得原始的相关配置信息,如 CMDB 数据等。然后通过观测云 Pipeline 中的 refere_table() 方法


深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架
q***2512025/11/16

SQLSugar 是一个高效、易用的 .NET ORM 框架,支持多种数据库(如 SQL Server、MySQL、PostgreSQL 等)。它提供了丰富的功能,包括 CRUD 操作、事务管理、动态表名、多表联查等,开发者可以通过简单的链式操作实现复杂的数据库逻辑。 本文将以完整的示例,详细介绍 SQLSugar 的安装、配置和功能使用,适用于 .NET Framework 和 .NET Core 项目。 一、SQLSugar简介 1. 什么是 SQLSugar? SQLSugar 是一个轻量


vscode编译C语言 | 在VSCode中配置编译环境与常见问题解决
epvikz_0732025/11/15

三十岁学编程|从零开始,如何在30岁起步学编程并成功转行许多人认为编程是年轻人的事情,尤其是到了三十岁,很多人会觉得自己已经错过了最佳学习的时机。然而,实际上三十岁学编程并非不可能,反而可能是一个崭新的开始。在这个信息化时代,编程能力已成为许多行业的基本技能,很多人通过自学编程成功转行,获得了新的职业发展机会。首先,学编程最重要的就是坚持和耐心。虽然编程看起来有些抽象,但通过系统的学习和实践,任何人都可以掌握基本的编程技能。比如,掌握Python或JavaScript等基础语言,它们不仅有着强大


用Microsoft Visual Studio Installer Projects 2022打包程序,同时安装VC++的运行库等
CE贝多芬2025/11/13

目录 一、安装插件 二、创建打包程序 在解决方案中新建打包项目 三、配置打包属性内容等 文件系统的各个文件夹 将输出程序打包进Application Folder 创建桌面快捷方式 创建卸载程序 给快捷方式创建图标 设置打包时的属性以及安装语言,安装位置等信息 四、打包 五、附录 六、附录二 一、安装插件 说明: Microsoft Visual Studio Installer Projects 2022 是微软官方提供的 Visual Studio


高德MCP服务接入
QD.Joker2025/11/12

创建一个agent,集成高德MCP工具 文章目录 一、安装依赖二、获取高德key三、代码实现 一、安装依赖 pip install openai pip install langchain (1.0版本以上) pip install langchain_mcp_adapters 二、获取高德key https://lbs.amap.com/api/mcp-server/create-project-and-key 三、代码实现 import asynci


XC7A200T-2FBG676I Xilinx AMD Artix-7 FPGA
XINVRY-FPGA2025/11/10

XC7A200T-2FBG676I 是 赛灵思 Xilinx AMD 推出的高性能低功耗 FPGA,隶属于 Artix-7 系列。该芯片基于 28nm 低功耗硅工艺,采用可扩展的 7 系架构,旨在在性能、功耗和成本之间实现最佳平衡。它主要面向高速数据采集、视频处理、通信系统、工业控制与嵌入式硬件加速等场合,适合那些需要较高逻辑容量和中高速信号处理能力的系统。 该芯片拥有约 215,360 个逻辑单元,包含约 33,650 个查找表(LUT)等效逻辑模块,内部集成大容量片上存储资源,总片上


Socket编程实战:从基础API到多线程服务器
violet-lz2025/11/8

一、Socket编程概述:网络通信的桥梁 Socket(套接字)是网络通信的端点,它提供了不同主机间进程通信的接口。在Linux系统中,Socket可以被视为一种特殊的文件描述符,通过标准的文件I/O操作来进行网络数据传输。 Socket编程的核心概念         通信域:确定通信的协议族和地址格式         套接字类型:定义通信的语义和特性         协议:指定具体的传输协议         地址:标识网络中的通信端点 学习Socket编程的重要性:      


Python编程实战 · 基础入门篇 | 列表(list)
程序员爱钓鱼2025/11/6

在 Python 中,列表(list) 是最常用、最灵活的数据结构之一。 它能存放多个数据,可以增删改查,还能嵌套其他列表,是编程中处理“集合类信息”的核心工具。 本章我们将系统学习列表的定义、操作方法、常用函数与实战应用。 一、什么是列表 列表(list)是一个 有序、可变 的元素集合。 它可以存储任意类型的数据,包括数字、字符串、布尔值、甚至其他列表。 示例: numbers = [1, 2, 3, 4, 5] fruits = ["apple", "banana", "cherry"]


Python 的内置函数 float
IMPYLH2025/11/1

Python 内建函数列表 > Python 的内置函数 float Python 的内置函数 float() 是一个用于将数字或字符串转换为浮点数(即带有小数部分的数字)的函数。它是 Python 中处理数值转换的重要工具之一,常用于数据类型转换和数值计算场景。 功能说明 无参数调用:当不带任何参数调用时,float() 会返回 0.0 print(float()) # 输出: 0.0 数字转换: 整数转换为浮点数print(float(5)) # 输出: 5.0 布尔


【操作系统】计算机系统概述
.笑对人生.2025/10/30

目录 一、操作系统的基本概念 (一)操作系统的概念 (二)操作系统的功能和目标 (三)操作系统的特征 二、操作系统发展历程 (一)手工操作阶段(此阶段无操作系统) (二)批处理阶段(操作系统开始出现) (三)分时操作系统 (四)实时操作系统 (五)网络操作系统和分布式计算机系统 (六)个人计算机操作系统 三、操作系统的运行环境 (一)处理器运行模式 (二)中断和异常的概念 (三)系统调用 (四)操作系统运行环境的切换 四、操作系统结构 五、操作系统引导

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0