1use std::collections::HashMap;
2use std::error::Error;
3use std::ops::{Index, IndexMut};
4
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6use serde_json::Value;
7
8use crate::number::Number;
9use crate::object::Object;
10use crate::{JsonResult, JsonValue, NULL};
11
12impl Index<usize> for JsonValue {
13 type Output = JsonValue;
14
15 fn index(&self, index: usize) -> &Self::Output {
16 match self {
17 JsonValue::Array(vec) => vec.get(index).unwrap_or(&NULL),
18 _ => &NULL
19 }
20 }
21}
22
23impl IndexMut<usize> for JsonValue {
24 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
25 match self {
26 JsonValue::Array(vec) => {
27 let in_bounds = index < vec.len();
28 if in_bounds {
29 &mut vec[index]
30 } else {
31 vec.push(JsonValue::Null);
32 vec.last_mut().unwrap()
33 }
34 }
35 _ => {
36 *self = JsonValue::Array(vec![]);
37 self.push(JsonValue::Null);
38 self.index_mut(index)
39 }
40 }
41 }
42}
43
44impl<'a> Index<&'a str> for JsonValue {
45 type Output = JsonValue;
46
47 fn index(&self, index: &str) -> &JsonValue {
48 match *self {
49 JsonValue::Object(ref object) => &object[index],
50 _ => &NULL
51 }
52 }
53}
54
55impl Index<String> for JsonValue {
56 type Output = JsonValue;
57
58 fn index(&self, index: String) -> &JsonValue {
59 self.index(index.as_str())
60 }
61}
62
63impl<'a> Index<&'a String> for JsonValue {
64 type Output = JsonValue;
65
66 fn index(&self, index: &String) -> &JsonValue {
67 self.index(index.as_str())
68 }
69}
70
71impl<'a> IndexMut<&'a str> for JsonValue {
72 fn index_mut(&mut self, index: &str) -> &mut JsonValue {
73 match *self {
74 JsonValue::Object(ref mut object) => {
75 &mut object[index]
76 }
77 _ => {
78 *self = JsonValue::new_object();
79 self.index_mut(index)
80 }
81 }
82 }
83}
84
85impl IndexMut<String> for JsonValue {
86 fn index_mut(&mut self, index: String) -> &mut JsonValue {
87 self.index_mut(index.as_str())
88 }
89}
90
91impl<'a> IndexMut<&'a String> for JsonValue {
92 fn index_mut(&mut self, index: &String) -> &mut JsonValue {
93 self.index_mut(index.as_str())
94 }
95}
96
97impl JsonValue {
98 pub fn is_string(&self) -> bool {
99 matches!(self, JsonValue::String(_))
100 }
101
102 pub fn is_number(&self) -> bool {
103 matches!(self, JsonValue::Number(_))
104 }
105
106 pub fn is_boolean(&self) -> bool {
107 matches!(self, JsonValue::Boolean(_))
108 }
109
110 pub fn is_null(&self) -> bool {
111 matches!(self, JsonValue::Null)
112 }
113
114 pub fn is_object(&self) -> bool {
115 matches!(self, JsonValue::Object(_))
116 }
117
118 pub fn is_array(&self) -> bool {
119 matches!(self, JsonValue::Array(_))
120 }
121
122 pub fn as_str(&self) -> JsonResult<&str> {
123 match *self {
124 JsonValue::String(ref value) => Ok(value),
125 _ => Err("parse str error!".into())
126 }
127 }
128
129 pub fn as_number(&self) -> JsonResult<Number> {
130 match self {
131 JsonValue::Number(value) => Ok(value.clone()),
132 JsonValue::String(s) => Ok(Number::F64(s.parse::<f64>().or(Err("str to number error!"))?)),
133 _ => Err("not number json value!".into())
134 }
135 }
136
137 pub fn as_f64(&self) -> JsonResult<f64> {
138 Ok(self.as_number()?.as_f64())
139 }
140
141 pub fn as_f32(&self) -> JsonResult<f32> {
142 Ok(self.as_number()?.as_f32())
143 }
144
145 pub fn as_u64(&self) -> JsonResult<u64> {
146 Ok(self.as_number()?.as_u64())
147 }
148
149 pub fn as_u32(&self) -> JsonResult<u32> {
150 Ok(self.as_number()?.as_u32())
151 }
152
153 pub fn as_u16(&self) -> JsonResult<u16> {
154 Ok(self.as_number()?.as_u16())
155 }
156
157 pub fn as_u8(&self) -> JsonResult<u8> {
158 Ok(self.as_number()?.as_u8())
159 }
160
161 pub fn as_usize(&self) -> JsonResult<usize> {
162 Ok(self.as_number()?.as_usize())
163 }
164
165 pub fn as_i64(&self) -> JsonResult<i64> {
166 Ok(self.as_number()?.as_i64())
167 }
168
169 pub fn as_i32(&self) -> JsonResult<i32> {
170 Ok(self.as_number()?.as_i32())
171 }
172
173 pub fn as_i16(&self) -> JsonResult<i16> {
174 Ok(self.as_number()?.as_i16())
175 }
176
177 pub fn as_i8(&self) -> JsonResult<i8> {
178 Ok(self.as_number()?.as_i8())
179 }
180
181 pub fn as_isize(&self) -> JsonResult<isize> {
182 Ok(self.as_number()?.as_isize())
183 }
184
185 pub fn as_bool(&self) -> JsonResult<bool> {
186 match self {
187 JsonValue::Boolean(value) => Ok(*value),
188 _ => Err("parse bool error!".into())
189 }
190 }
191}
192
193impl From<String> for JsonValue {
194 fn from(value: String) -> Self {
195 JsonValue::String(value)
196 }
197}
198
199impl<'a> From<&'a str> for JsonValue {
200 fn from(value: &'a str) -> Self {
201 JsonValue::String(value.to_string())
202 }
203}
204
205impl<'a> From<&'a String> for JsonValue {
206 fn from(value: &'a String) -> Self {
207 JsonValue::String(value.to_string())
208 }
209}
210
211impl From<i8> for JsonValue {
212 fn from(value: i8) -> Self {
213 JsonValue::Number(Number::I8(value))
214 }
215}
216
217impl From<&i8> for JsonValue {
218 fn from(value: &i8) -> Self {
219 JsonValue::Number(Number::I8(*value))
220 }
221}
222
223impl From<i16> for JsonValue {
224 fn from(value: i16) -> Self {
225 JsonValue::Number(Number::I16(value))
226 }
227}
228
229impl From<&i16> for JsonValue {
230 fn from(value: &i16) -> Self {
231 JsonValue::Number(Number::I16(*value))
232 }
233}
234
235impl From<i32> for JsonValue {
236 fn from(value: i32) -> Self {
237 JsonValue::Number(Number::I32(value))
238 }
239}
240
241impl From<&i32> for JsonValue {
242 fn from(value: &i32) -> Self {
243 JsonValue::Number(Number::I32(*value))
244 }
245}
246
247impl From<i64> for JsonValue {
248 fn from(value: i64) -> Self {
249 JsonValue::Number(Number::I64(value))
250 }
251}
252
253impl From<&i64> for JsonValue {
254 fn from(value: &i64) -> Self {
255 JsonValue::Number(Number::I64(*value))
256 }
257}
258
259impl From<i128> for JsonValue {
260 fn from(value: i128) -> Self {
261 JsonValue::Number(Number::I128(value))
262 }
263}
264
265impl From<&i128> for JsonValue {
266 fn from(value: &i128) -> Self {
267 JsonValue::Number(Number::I128(*value))
268 }
269}
270
271impl From<isize> for JsonValue {
272 fn from(value: isize) -> Self {
273 JsonValue::Number(Number::Isize(value))
274 }
275}
276
277impl From<u8> for JsonValue {
278 fn from(value: u8) -> Self {
279 JsonValue::Number(Number::U8(value))
280 }
281}
282
283impl From<&u8> for JsonValue {
284 fn from(value: &u8) -> Self {
285 JsonValue::Number(Number::U8(*value))
286 }
287}
288
289impl From<u16> for JsonValue {
290 fn from(value: u16) -> Self {
291 JsonValue::Number(Number::U16(value))
292 }
293}
294
295impl From<&u16> for JsonValue {
296 fn from(value: &u16) -> Self {
297 JsonValue::Number(Number::U16(*value))
298 }
299}
300
301impl From<u32> for JsonValue {
302 fn from(value: u32) -> Self {
303 JsonValue::Number(Number::U32(value))
304 }
305}
306
307impl From<&u32> for JsonValue {
308 fn from(value: &u32) -> Self {
309 JsonValue::Number(Number::U32(*value))
310 }
311}
312
313impl From<u64> for JsonValue {
314 fn from(value: u64) -> Self {
315 JsonValue::Number(Number::U64(value))
316 }
317}
318
319impl From<&u64> for JsonValue {
320 fn from(value: &u64) -> Self {
321 JsonValue::Number(Number::U64(*value))
322 }
323}
324
325impl From<u128> for JsonValue {
326 fn from(value: u128) -> Self {
327 JsonValue::Number(Number::U128(value))
328 }
329}
330
331impl From<&u128> for JsonValue {
332 fn from(value: &u128) -> Self {
333 JsonValue::Number(Number::U128(*value))
334 }
335}
336
337impl From<usize> for JsonValue {
338 fn from(value: usize) -> Self {
339 JsonValue::Number(Number::I64(value as i64))
340 }
341}
342
343impl From<f32> for JsonValue {
344 fn from(value: f32) -> Self {
345 JsonValue::Number(Number::F32(value))
346 }
347}
348
349impl From<&f32> for JsonValue {
350 fn from(value: &f32) -> Self {
351 JsonValue::Number(Number::F32(*value))
352 }
353}
354
355impl From<f64> for JsonValue {
356 fn from(value: f64) -> Self {
357 JsonValue::Number(Number::F64(value))
358 }
359}
360
361impl From<&f64> for JsonValue {
362 fn from(value: &f64) -> Self {
363 JsonValue::Number(Number::F64(*value))
364 }
365}
366
367
368impl From<bool> for JsonValue {
369 fn from(value: bool) -> Self {
370 JsonValue::Boolean(value)
371 }
372}
373
374impl From<&bool> for JsonValue {
375 fn from(value: &bool) -> Self {
376 JsonValue::Boolean(*value)
377 }
378}
379
380impl<T> From<Vec<T>> for JsonValue
381where
382 T: Into<JsonValue>,
383{
384 fn from(value: Vec<T>) -> Self {
385 let mut array = JsonValue::new_array();
386 for v in value {
387 array.push(v.into());
388 }
389 array
390 }
391}
392
393
394impl<'a, T> From<HashMap<&'a str, T>> for JsonValue
395where
396 T: Into<JsonValue>,
397{
398 fn from(value: HashMap<&'a str, T>) -> Self {
399 let mut object = JsonValue::new_object();
400 for (k, v) in value {
401 object.insert(k, v.into()).unwrap();
402 }
403 object
404 }
405}
406
407impl<T> From<HashMap<String, T>> for JsonValue
408where
409 T: Into<JsonValue>,
410{
411 fn from(value: HashMap<String, T>) -> Self {
412 let mut object = JsonValue::new_object();
413 for (k, v) in value {
414 object.insert(k.as_str(), v.into()).unwrap();
415 }
416 object
417 }
418}
419
420impl<'a, T: Clone> From<&'a [T]> for JsonValue
421where
422 T: Into<JsonValue>,
423{
424 fn from(value: &'a [T]) -> Self {
425 let mut array = JsonValue::new_array();
426 for v in value {
427 array.push(v.clone().into())
428 };
429 array
430 }
431}
432
433impl<T> From<Option<T>> for JsonValue
434where
435 T: Into<JsonValue>,
436{
437 fn from(value: Option<T>) -> Self {
438 match value {
439 None => { JsonValue::Null }
440 Some(v) => { v.into() }
441 }
442 }
443}
444
445impl Into<Box<dyn Error>> for JsonValue {
446 fn into(self) -> Box<dyn Error> {
447 Box::from(self.to_string())
448 }
449}
450
451impl Serialize for JsonValue {
452 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
453 where
454 S: Serializer,
455 {
456 match self {
457 JsonValue::Null => Value::Null.serialize(serializer),
458 JsonValue::String(v) => v.serialize(serializer),
459 JsonValue::Number(v) => v.serialize(serializer),
460 JsonValue::Boolean(v) => v.serialize(serializer),
461 JsonValue::Object(v) => v.serialize(serializer),
462 JsonValue::Array(v) => v.serialize(serializer),
463 }
464 }
465}
466
467impl<'de> Deserialize<'de> for JsonValue {
468 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
469 where
470 D: Deserializer<'de>,
471 {
472 let value = Value::deserialize(deserializer)?;
473 Ok(JsonValue::try_from(value).or(Err(serde::de::Error::custom("to json value error")))?)
474 }
475}
476
477impl TryFrom<Value> for JsonValue {
478 type Error = serde::de::value::Error;
479
480 fn try_from(value: Value) -> Result<Self, Self::Error> {
481 match value {
482 Value::Null => Ok(JsonValue::Null),
483 Value::Bool(v) => Ok(JsonValue::Boolean(v)),
484 Value::Number(v) => Ok(JsonValue::Number(Number::try_from(v).or(Err(serde::de::Error::custom("to number error")))?)),
485 Value::String(v) => Ok(JsonValue::String(v)),
486 Value::Array(v) => {
487 let mut array = JsonValue::new_array();
488 for value in v {
489 array.push(JsonValue::try_from(value)?);
490 }
491 Ok(array)
492 }
493 Value::Object(v) => Ok(JsonValue::Object(Object::try_from(v)?))
494 }
495 }
496}
497
498#[cfg(test)]
499mod tests {
500 use crate::JsonValue;
501
502 #[test]
503 fn test_object() {
504 let jd = crate::object! {
505 "sdsd":"dffdf",
506 "dfdf":[1,2,3,4],
507 "dfdg":null,
508 "tf":1,
509 "fs":false,
510 "sf":1.23234,
511 "dffdfdf":{
512 "1":1,
513 "2":2,
514 "3":3,
515 }
516 };
517 let strs = serde_json::to_string_pretty(&jd).unwrap();
518 println!("{}", strs);
519 let v: JsonValue = serde_json::from_str(&strs).unwrap();
520 println!("{}", v.pretty());
521 println!("{} {}", v["sdsd"].to_string(), v["tf"].pretty())
522 }
523}