compress_json_rs/
helpers.rs

1use serde_json::{Value, Map};
2
3/// Remove keys with null values from a JSON object (shallow)
4pub fn trim_undefined(object: &mut Map<String, Value>) {
5    object.retain(|_, v| !v.is_null());
6}
7
8/// Recursively remove keys with null values in nested JSON objects
9pub fn trim_undefined_recursively(object: &mut Map<String, Value>) {
10    let mut tracks = Vec::new();
11    fn recurse(obj: &mut Map<String, Value>, tracks: &mut Vec<*const Map<String, Value>>) {
12        tracks.push(obj as *const _);
13        let keys: Vec<String> = obj.keys().cloned().collect();
14        for key in keys {
15            if let Some(mut v) = obj.remove(&key) {
16                if v.is_null() {
17                    // skip insertion
18                } else {
19                    match v {
20                        Value::Object(mut m) => {
21                            let ptr = &m as *const _;
22                            if !tracks.contains(&ptr) {
23                                recurse(&mut m, tracks);
24                            }
25                            obj.insert(key, Value::Object(m));
26                        }
27                        other => {
28                            obj.insert(key, other);
29                        }
30                    }
31                }
32            }
33        }
34    }
35    recurse(object, &mut tracks);
36}