use serde_json::Value as JsonValue;
use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq)]
pub enum TypeJsonValue {
Str(String),
DateTime(String),
Number(f64),
Array(Vec<TypeJsonValue>),
Object(HashMap<String, TypeJsonValue>),
Bool(bool),
Empty
}
pub fn parse_string(value: &JsonValue) -> Option<TypeJsonValue> {
if let JsonValue::String(s) = value {
Some(TypeJsonValue::Str(s.to_owned()))
} else {
None
}
}
pub fn parse_bool(value: &JsonValue) -> Option<TypeJsonValue> {
if let JsonValue::Bool(b) = value {
Some(TypeJsonValue::Bool(*b))
} else {
None
}
}
pub fn parse_number(value: &JsonValue) -> Option<TypeJsonValue> {
if let JsonValue::Number(n) = value {
if let Some(i) = n.as_f64() {
Some(TypeJsonValue::Number(i))
} else if let Some(f) = n.as_i64() {
let float_value: f64 = f as f64;
Some(TypeJsonValue::Number(float_value))
} else {
None
}
} else {
None
}
}
pub fn parse_array(value: &JsonValue) -> Option<TypeJsonValue> {
if let JsonValue::Array(arr) = value {
let values = arr
.iter()
.filter_map(|item| {
parse_string(item)
.or_else(|| parse_number(item))
.or_else(|| parse_bool(value))
.or_else(|| parse_array(item))
.or_else(|| parse_object(item))
})
.collect();
Some(TypeJsonValue::Array(values))
} else {
None
}
}
pub fn parse_object(value: &JsonValue) -> Option<TypeJsonValue> {
if let JsonValue::Object(obj) = value {
let mut map = HashMap::new();
for (key, value) in obj {
let parsed_value = parse_string(value)
.or_else(|| parse_number(value))
.or_else(|| parse_bool(value))
.or_else(|| parse_array(value))
.or_else(|| parse_object(value));
if let Some(tpye_value) = parsed_value {
map.insert(key.clone(), tpye_value);
}
}
Some(TypeJsonValue::Object(map))
} else {
None
}
}
pub fn create_tpye_value(json: &JsonValue) -> Option<TypeJsonValue> {
parse_string(json)
.or_else(|| parse_number(json))
.or_else(|| parse_bool(json))
.or_else(|| parse_array(json))
.or_else(|| parse_object(json))
.or_else(|| {
println!("字段 不存在或类型不支持");
None
})
}