improve null handling
This commit is contained in:
+31
@@ -128,6 +128,7 @@ impl DotPaths for serde_json::Value {
|
||||
match self {
|
||||
Value::Array(vec) => vec.dot_get(path),
|
||||
Value::Object(map) => map.dot_get(path),
|
||||
Value::Null => None,
|
||||
_ => {
|
||||
if path.is_empty() {
|
||||
serde_json::from_value(self.to_owned()).ok()
|
||||
@@ -142,6 +143,7 @@ impl DotPaths for serde_json::Value {
|
||||
match self {
|
||||
Value::Array(vec) => vec.dot_get_mut(path),
|
||||
Value::Object(map) => map.dot_get_mut(path),
|
||||
Value::Null => None,
|
||||
_ => {
|
||||
if path.is_empty() {
|
||||
Some(self)
|
||||
@@ -227,6 +229,10 @@ fn new_by_path_root<T>(path: &str, value: T) -> Value
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
if path.is_empty() {
|
||||
return serde_json::to_value(value).expect("Serialize error");
|
||||
}
|
||||
|
||||
let (sub1, _) = path_split(path);
|
||||
if sub1 == "0" || sub1 == "+" || sub1 == "<" || sub1 == ">" {
|
||||
// new vec
|
||||
@@ -548,6 +554,31 @@ mod tests {
|
||||
let _ = value.dot_get::<Value>("1.2.3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_null() {
|
||||
let mut item = Value::Null;
|
||||
item.dot_set("", "foo");
|
||||
assert_eq!(Value::String("foo".into()), item);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn replace_null() {
|
||||
let mut item = Value::Null;
|
||||
assert_eq!(None, item.dot_replace::<_, Value>("", "foo"));
|
||||
assert_eq!(Value::String("foo".into()), item);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn take_null() {
|
||||
let mut item = Value::Null;
|
||||
assert_eq!(None, item.dot_take::<Value>(""));
|
||||
assert_eq!(Value::Null, item);
|
||||
|
||||
let mut item = Value::Bool(true);
|
||||
assert_eq!(Some(true), item.dot_take::<bool>(""));
|
||||
assert_eq!(Value::Null, item);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_vec() {
|
||||
let mut vec = Value::Array(vec![]);
|
||||
|
||||
Reference in New Issue
Block a user