json_parser_simple/
lib.rs1use 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}