json_parser_simple/
lib.rs

1use std::collections::HashMap;
2
3#[derive(Debug)]
4pub enum JsonValue {
5    Object(HashMap<String, JsonValue>),
6    Array(Vec<JsonValue>),
7    String(String),
8    Number(f64),
9    Bool(bool),
10    Null,
11}
12
13fn json_get_value(value: &str) -> JsonValue {
14    let trimmed = value.trim();
15
16    if trimmed == "null" {
17        JsonValue::Null
18    } else if trimmed == "true" {
19        JsonValue::Bool(true)
20    } else if trimmed == "false" {
21        JsonValue::Bool(false)
22    } else if let Ok(number) = trimmed.parse::<f64>() {
23        JsonValue::Number(number)
24    } else if trimmed.starts_with('\"') && trimmed.ends_with('\"') {
25        JsonValue::String(trimmed[1..trimmed.len() - 1].to_string())
26    } else if trimmed.starts_with('{') && trimmed.ends_with('}') {
27        parse_object(&trimmed[1..trimmed.len() - 1])
28    } else if trimmed.starts_with('[') && trimmed.ends_with(']') {
29        parse_array(&trimmed[1..trimmed.len() - 1])
30    } else {
31        JsonValue::String(trimmed.to_string())
32    }
33}
34
35
36fn parse_object(value: &str) -> JsonValue {
37    let mut object = HashMap::new();
38    let mut key = String::new();
39    let mut val = String::new();
40    let mut in_key = true;
41    let mut in_string = false;
42    let mut depth = 0;
43    let mut chars = value.chars().peekable();
44
45    while let Some(ch) = chars.next() {
46        match ch {
47            '{' | '[' => {
48                depth += 1;
49                if in_key {
50                    key.push(ch);
51                } else {
52                    val.push(ch);
53                }
54                while let Some(inner_ch) = chars.next() {
55                    match inner_ch {
56                        '}' | ']' => {
57                            depth -= 1;
58                            if in_key {
59                                key.push(inner_ch);
60                            } else {
61                                val.push(inner_ch);
62                            }
63                            if depth == 0 {
64                                break;
65                            }
66                        }
67                        _ => {
68                            if in_key {
69                                key.push(inner_ch);
70                            } else {
71                                val.push(inner_ch);
72                            }
73                        }
74                    }
75                }
76            }
77            ':' if depth == 0 && in_key => {
78                in_key = false;
79            }
80            ',' if depth == 0 => {
81                object.insert(key.trim().trim_matches('\"').to_string(), json_get_value(val.trim()));
82                key = String::new();
83                val = String::new();
84                in_key = true;
85            }
86            _ => {
87                if in_key {
88                    key.push(ch);
89                } else {
90                    val.push(ch);
91                }
92            }
93        }
94    }
95    if !key.is_empty() {
96        object.insert(key.trim().trim_matches('\"').to_string(), json_get_value(val.trim()));
97    }
98    JsonValue::Object(object)
99}
100
101fn parse_array(value: &str) -> JsonValue {
102    let mut elements = Vec::new();
103    let mut element = String::new();
104    let mut depth = 0;
105    let mut chars = value.chars().peekable();
106
107    while let Some(ch) = chars.next() {
108        match ch {
109            '{' | '[' => {
110                depth += 1;
111                element.push(ch);
112                while let Some(inner_ch) = chars.next() {
113                    match inner_ch {
114                        '}' | ']' => {
115                            depth -= 1;
116                            element.push(inner_ch);
117                            if depth == 0 {
118                                break;
119                            }
120                        }
121                        _ => element.push(inner_ch),
122                    }
123                }
124            }
125            ',' if depth == 0 => {
126                elements.push(json_get_value(element.trim()));
127                element = String::new();
128            }
129            _ => element.push(ch),
130        }
131    }
132    if !element.is_empty() {
133        elements.push(json_get_value(element.trim()));
134    }
135    JsonValue::Array(elements)
136}
137
138
139pub fn json_scan(json: &str) -> HashMap<String, JsonValue> {
140    if let JsonValue::Object(object) = json_get_value(json) {
141        object
142    } else {
143        HashMap::new()
144    }
145}