use crate::string::StringExentd;
use crate::{IResult, JsonV};
use serde::de::DeserializeOwned;
use serde_json::Map;
use std::fmt::Debug;
pub trait JsonVExentd {
fn as_string2(&self) -> Option<String>;
fn as_arrary2(&self) -> Option<Vec<JsonV>>;
fn as_object2(&self) -> Option<serde_json::Map<String, JsonV>>;
}
impl JsonVExentd for JsonV {
fn as_string2(&self) -> Option<String> {
match self {
JsonV::String(v) => Some(v.to_string()),
_ => None,
}
}
fn as_arrary2(&self) -> Option<Vec<JsonV>> {
match self {
JsonV::Array(v) => Some(v.clone()),
_ => None,
}
}
fn as_object2(&self) -> Option<Map<String, JsonV>> {
match self {
JsonV::Object(v) => Some(v.clone()),
_ => None,
}
}
}
pub trait SerdejsonExentd {
fn get_json_field<R: DeserializeOwned + Debug>(input_data: &Option<JsonV>, k: &str) -> IResult<R>;
fn get_json_field2(&self, k: &str) -> IResult<JsonV>;
}
impl SerdejsonExentd for &str {
fn get_json_field<R: DeserializeOwned + Debug>(json_value: &Option<JsonV>, k: &str) -> IResult<R> {
String::get_json_field(json_value, k)
}
fn get_json_field2(&self, k: &str) -> IResult<JsonV> {
let mut v = serde_json::from_str::<JsonV>(self)?;
let k_arr = k.split_char(".");
for x in k_arr {
if x.trim() == "" {
continue;
}
v = v[x].to_owned();
}
Ok(v)
}
}
impl SerdejsonExentd for String {
fn get_json_field<R: DeserializeOwned + Debug>(json_value: &Option<JsonV>, k: &str) -> IResult<R> {
let r = json_value
.as_ref()
.ok_or(format!("[{}]数据为空", k))?
.as_object()
.ok_or(format!("[{}]反序列化为JSON对象时出错", k))?
.get(k)
.ok_or_else(|| format!("[{}]JSON中没有数据", k))
.map(|v| serde_json::from_value::<R>(v.clone()).map_err(|e| format!("[{}]序列化为struct出错,{:?}", k, e)))??;
debug!("获得[{}]JSON数据, 返回: {:?}", k, &r);
Ok(r)
}
fn get_json_field2(&self, k: &str) -> IResult<JsonV> {
self.as_str().get_json_field2(k)
}
}
#[test]
fn test_json() {
let r = r##"{"k": {"k2": 345}, "k1": 123}"##.get_json_field2("k");
println!("{:?}", r);
}
pub fn get_json_string(json_map: &serde_json::Map<String, JsonV>, key: &str) -> IResult<String> {
let name = json_map.get(key).ok_or(format!("获得[{}]发生错误", key))?;
let name = name.as_str().ok_or(format!("获得[{}]序列化为字符串发生错误", key).as_str())?;
Ok(name.to_string())
}
pub fn marge_obj_data<T: serde::Serialize, T2: serde::Serialize + DeserializeOwned>(
src: &T,
tager_input: &mut T2,
) -> IResult {
let src = serde_json::to_value(src)?;
let tager = serde_json::to_string(tager_input)?;
let mut tager = serde_json::from_str::<JsonV>(&tager)?;
if let (Some(src), Some(tager)) = (src.as_object(), tager.as_object_mut()) {
let src = src.clone();
for (k, v) in src {
if !v.is_null(){
tager.insert(k, v);
}
}
}
let t2 = serde_json::from_value::<T2>(tager)?;
*tager_input = t2;
Ok(())
}