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

代码
use regex::Regex;
use rusqlite::{Connection, Result, params};
use serde_json::Value;
use std::collections::HashMap;
use std::error::Error;
fn convert_numbers_to_strings_with_regex(json_str: &str) -> Result<String, Box<dyn Error>> {
let mut result = json_str.to_string();
let re_obj_value = Regex::new(
r#"([^"]+)"\s*:\s*(-?(?:\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?))"#,
)?;
result = re_obj_value.replace_all(&result, r#"$1":"$2""#).to_string();
let re_arr_value = Regex::new(
r#"([\[\s,])\s*(-?(?:\d+(?:\.\d*)?(?:[eE][+-]?\d+)?|\.\d+(?:[eE][+-]?\d+)?))\s*([\],])"#,
)?;
result = re_arr_value.replace_all(&result, r#"$1"$2"$3"#).to_string();
Ok(result)
}
fn main() -> Result<(), Box<dyn Error>> {
let original_json_str = r#"
[
{
"name":"张三",
"as_name":"阿三",
"age":15.3200001,
"hobby":["足球",3.25,"羽毛球"],
"grade":{"语文":99999999999999999.999999999999999,"数学":96.44,"英语":"77.2511002"},
"membe":true
},
{
"name":"李四",
"age":17,
"hobby":[3.2,"篮球",10.2555],
"grade":{"语文":99999999999999999999999999999999,"数学":0.000000000000222,"英语":94.67},
"membe":false
},
{
"name":"王五",
"age":"5.25",
"hobby":[7.7,"3.222"],
"grade":{"语文":"999999999999999999999999999","数学":"0.000000000000222","英语":0},
"membe":false
}
]
"#;
let converted_json_str = convert_numbers_to_strings_with_regex(original_json_str)?;
let conn = Connection::open("tt.db")?;
create_db(&conn)?;
let json_value: Value = serde_json::from_str(&converted_json_str)?;
parse_json_and_store_in_db(&conn, &json_value)?;
Ok(())
}
fn create_db(conn: &Connection) -> Result<()> {
conn.execute(
"CREATE TABLE IF NOT EXISTS test_table (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
as_name TEXT,
age TEXT,
hobby TEXT,
grade TEXT,
membe TEXT
)",
[],
)?;
Ok(())
}
fn parse_json_and_store_in_db(conn: &Connection, json_str: &Value) -> Result<(), Box<dyn Error>> {
if let Value::Array(arr) = json_str {
for item in arr {
if let Value::Object(obj) = item {
let mut name = String::new();
let mut as_name = None;
let mut age = None;
let mut hobby = None;
let mut grade = None;
let mut membe = None;
for (key, value) in obj {
match key.as_str() {
"name" => {
if let Value::String(s) = value {
name = s.clone();
}
}
"as_name" => {
if let Value::String(s) = value {
as_name = Some(s.clone());
}
}
"age" => {
if let Value::String(s) = value {
age = Some(s.clone());
}
}
"hobby" => {
if let Value::Array(a) = value {
let mut hobby_list = Vec::new();
for v in a {
if let Value::String(s) = v {
hobby_list.push(s.clone());
}
}
hobby = Some(serde_json::to_string(&hobby_list)?);
}
}
"grade" => {
if let Value::Object(o) = value {
let mut grade_map = HashMap::new();
for (k, v) in o {
if let Value::String(n) = v {
grade_map.insert(k.clone(), n.clone());
}
}
grade = Some(serde_json::to_string(&grade_map)?);
}
}
"membe" => {
if let Value::Bool(b) = value {
membe = Some(b.to_string());
}
}
_ => continue,
}
}
conn.execute(
"INSERT INTO test_table (name, as_name, age, hobby, grade, membe) VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
params![name, as_name, age, hobby, grade, membe],
)?;
}
}
}
Ok(())
}
《rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)》 是转载文章,点击查看原文。