1use std::collections::HashMap;
2use std::hash::Hash;
3use std::str::Chars;
4
5pub struct SerJsonState {
6 pub out: String
7}
8
9impl SerJsonState {
10 pub fn indent(&mut self, _d: usize) {
11 }
15
16 pub fn field(&mut self, d: usize, field: &str) {
17 self.indent(d);
18 self.out.push('"');
19 self.out.push_str(field);
20 self.out.push('"');
21 self.out.push(':');
22 }
23
24 pub fn label(&mut self, label:&str){
25 self.out.push('"');
26 self.out.push_str(label);
27 self.out.push('"');
28 }
29
30 pub fn conl(&mut self) {
31 self.out.push(',')
32 }
33
34 pub fn st_pre(&mut self) {
35 self.out.push('{');
36 }
37
38 pub fn st_post(&mut self, d: usize) {
39 self.indent(d);
40 self.out.push('}');
41 }
42
43}
44
45pub trait SerJson {
46
47 fn serialize_json(&self) -> String {
48 let mut s = SerJsonState {
49 out: String::new()
50 };
51 self.ser_json(0, &mut s);
52 s.out
53 }
54
55 fn ser_json(&self, d: usize, s: &mut SerJsonState);
56}
57
58pub trait DeJson: Sized {
59
60 fn deserialize_json(input: &str) -> Result<Self,
61 DeJsonErr> {
62 let mut state = DeJsonState::default();
63 let mut chars = input.chars();
64 state.next(&mut chars);
65 state.next_tok(&mut chars) ?;
66 DeJson::de_json(&mut state, &mut chars)
67 }
68
69 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Self,
70 DeJsonErr>;
71}
72
73#[derive(PartialEq, Debug)]
74#[derive(Default)]
75pub enum DeJsonTok {
76 Str,
77 Char(char),
78 U64(u64),
79 I64(i64),
80 F64(f64),
81 Bool(bool),
82 BareIdent,
83 Null,
84 Colon,
85 CurlyOpen,
86 CurlyClose,
87 BlockOpen,
88 BlockClose,
89 Comma,
90 #[default]
91 Bof,
92 Eof
93}
94
95
96
97#[derive(Default)]
98pub struct DeJsonState {
99 pub cur: char,
100 pub tok: DeJsonTok,
101 pub strbuf:String,
102 pub numbuf:String,
103 pub identbuf:String,
104 pub line: usize,
105 pub col: usize
106}
107
108pub struct DeJsonErr{
109 pub msg:String,
110 pub line:usize,
111 pub col:usize
112}
113
114impl std::fmt::Debug for DeJsonErr {
115 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
116 write!(f, "Json Deserialize error: {}, line:{} col:{}", self.msg, self.line+1, self.col+1)
117 }
118}
119
120impl DeJsonState {
121 pub fn next(&mut self, i: &mut Chars) {
122 if let Some(c) = i.next() {
123 self.cur = c;
124 if self.cur == '\n'{
125 self.line += 1;
126 self.col = 0;
127 }
128 else{
129 self.col += 1;
130 }
131 }
132 else {
133 self.cur = '\0';
134 }
135 }
136
137 pub fn err_exp(&self, name: &str) -> DeJsonErr {
138 DeJsonErr{msg:format!("Unexpected key {}", name), line:self.line, col:self.col}
139 }
140
141 pub fn err_nf(&self, name: &str) -> DeJsonErr {
142 DeJsonErr{msg:format!("Key not found {}", name), line:self.line, col:self.col}
143 }
144
145 pub fn err_enum(&self, name: &str) -> DeJsonErr {
146 DeJsonErr{msg:format!("Enum not defined {}", name), line:self.line, col:self.col}
147 }
148
149 pub fn err_token(&self, what:&str) -> DeJsonErr {
150 DeJsonErr{msg:format!("Unexpected token {:?} expected {} ", self.tok, what), line:self.line, col:self.col}
151 }
152
153 pub fn err_range(&self, what:&str) -> DeJsonErr {
154 DeJsonErr{msg:format!("Value out of range {} ", what), line:self.line, col:self.col}
155 }
156
157 pub fn err_type(&self, what:&str) -> DeJsonErr {
158 DeJsonErr{msg:format!("Token wrong type {} ", what), line:self.line, col:self.col}
159 }
160
161 pub fn err_parse(&self, what:&str) -> DeJsonErr {
162 DeJsonErr{msg:format!("Cannot parse {} ", what), line:self.line, col:self.col}
163 }
164
165 pub fn eat_comma_block(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
166 match self.tok {
167 DeJsonTok::Comma => {
168 self.next_tok(i) ?;
169 Ok(())
170 },
171 DeJsonTok::BlockClose => {
172 Ok(())
173 }
174 _ => {
175 Err(self.err_token(", or ]"))
176 }
177 }
178 }
179
180 pub fn eat_comma_curly(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
181 match self.tok {
182 DeJsonTok::Comma => {
183 self.next_tok(i) ?;
184 Ok(())
185 },
186 DeJsonTok::CurlyClose => {
187 Ok(())
188 }
189 _ => {
190 Err(self.err_token(", or }"))
191 }
192 }
193 }
194
195 pub fn colon(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
196 match self.tok {
197 DeJsonTok::Colon => {
198 self.next_tok(i) ?;
199 Ok(())
200 },
201 _ => {
202 Err(self.err_token(":"))
203 }
204 }
205 }
206
207
208 pub fn string(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
209 match &mut self.tok {
210 DeJsonTok::Str => {
211 self.next_tok(i) ?;
212 Ok(())
213 },
214 _ => {
215 Err(self.err_token("String"))
216 }
217 }
218 }
219
220 pub fn next_colon(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
221 self.next_tok(i) ?;
222 self.colon(i) ?;
223 Ok(())
224 }
225
226 pub fn next_str(&mut self) -> Option<()> {
227 if let DeJsonTok::Str = &mut self.tok {
228 Some(())
231 }
232 else {
233 None
234 }
235 }
236
237 pub fn block_open(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
238 if self.tok == DeJsonTok::BlockOpen {
239 self.next_tok(i) ?;
240 return Ok(())
241 }
242 Err(self.err_token("["))
243 }
244
245
246 pub fn block_close(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
247 if self.tok == DeJsonTok::BlockClose {
248 self.next_tok(i) ?;
249 return Ok(())
250 }
251 Err(self.err_token("]"))
252 }
253
254 pub fn curly_open(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
255 if self.tok == DeJsonTok::CurlyOpen {
256 self.next_tok(i) ?;
257 return Ok(())
258 }
259 Err(self.err_token("{"))
260 }
261
262
263 pub fn curly_close(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
264 if self.tok == DeJsonTok::CurlyClose {
265 self.next_tok(i) ?;
266 return Ok(())
267 }
268 Err(self.err_token("}"))
269 }
270
271 pub fn u64_range(&mut self, max: u64) -> Result<u64, DeJsonErr> {
272 if let DeJsonTok::U64(value) = self.tok {
273 if value > max {
274 return Err(self.err_range(&format!("{}>{}", value, max)))
275 }
276 return Ok(value)
277 }
278 Err(self.err_token("unsigned integer"))
279 }
280
281 pub fn i64_range(&mut self, min: i64, max: i64) -> Result<i64, DeJsonErr> {
282 if let DeJsonTok::I64(value) = self.tok {
283 if value< min {
284 return Err(self.err_range(&format!("{}<{}", value, min)))
285 }
286 return Ok(value)
287 }
288 if let DeJsonTok::U64(value) = self.tok {
289 if value as i64 > max {
290 return Err(self.err_range(&format!("{}>{}", value, max)))
291 }
292 return Ok(value as i64)
293 }
294 Err(self.err_token("signed integer"))
295 }
296
297 pub fn as_f64(&mut self) -> Result<f64, DeJsonErr> {
298 if let DeJsonTok::I64(value) = self.tok {
299 return Ok(value as f64)
300 }
301 if let DeJsonTok::U64(value) = self.tok {
302 return Ok(value as f64)
303 }
304 if let DeJsonTok::F64(value) = self.tok {
305 return Ok(value)
306 }
307 Err(self.err_token("floating point"))
308 }
309
310 pub fn as_bool(&mut self) -> Result<bool, DeJsonErr> {
311 if let DeJsonTok::Bool(value) = self.tok {
312 return Ok(value)
313 }
314 Err(self.err_token("boolean"))
315 }
316
317 pub fn as_string(&mut self) -> Result<String, DeJsonErr> {
318 if let DeJsonTok::Str = &mut self.tok {
319 let mut val = String::new();
320 std::mem::swap(&mut val, &mut self.strbuf);
321 return Ok(val)
322 }
323 Err(self.err_token("string"))
324 }
325
326 pub fn next_tok(&mut self, i: &mut Chars) -> Result<(), DeJsonErr> {
327 while self.cur == '\n' || self.cur == '\r' || self.cur == '\t' || self.cur == ' ' {
328 self.next(i);
329 }
330 if self.cur == '\0' {
331 self.tok = DeJsonTok::Eof;
332 return Ok(())
333 }
334 match self.cur {
335 ':' => {
336 self.next(i);
337 self.tok = DeJsonTok::Colon;
338 Ok(())
339 }
340 ',' => {
341 self.next(i);
342 self.tok = DeJsonTok::Comma;
343 Ok(())
344 }
345 '[' => {
346 self.next(i);
347 self.tok = DeJsonTok::BlockOpen;
348 Ok(())
349 }
350 ']' => {
351 self.next(i);
352 self.tok = DeJsonTok::BlockClose;
353 Ok(())
354 }
355 '{' => {
356 self.next(i);
357 self.tok = DeJsonTok::CurlyOpen;
358 Ok(())
359 }
360 '}' => {
361 self.next(i);
362 self.tok = DeJsonTok::CurlyClose;
363 Ok(())
364 }
365 '-' | '0'..='9' => {
366 self.numbuf.clear();
367 let is_neg = if self.cur == '-' {
368 self.numbuf.push(self.cur);
369 self.next(i);
370 true
371 }
372 else {
373 false
374 };
375 while self.cur >= '0' && self.cur <= '9' {
376 self.numbuf.push(self.cur);
377 self.next(i);
378 }
379 if self.cur == '.' {
380 self.numbuf.push(self.cur);
381 self.next(i);
382 while self.cur >= '0' && self.cur <= '9' {
383 self.numbuf.push(self.cur);
384 self.next(i);
385 }
386 if let Ok(num) = self.numbuf.parse() {
387 self.tok = DeJsonTok::F64(num);
388 Ok(())
389 }
390 else {
391 Err(self.err_parse("number"))
392 }
393 }
394 else {
395 if is_neg {
396 if let Ok(num) = self.numbuf.parse() {
397 self.tok = DeJsonTok::I64(num);
398 return Ok(())
399 }
400 else {
401 return Err(self.err_parse("number"));
402 }
403 }
404 if let Ok(num) = self.numbuf.parse() {
405 self.tok = DeJsonTok::U64(num);
406 Ok(())
407 }
408 else {
409 Err(self.err_parse("number"))
410 }
411 }
412 },
413 'a'..='z' | 'A'..='Z' | '_' => {
414 self.identbuf.clear();
415 while self.cur >= 'a' && self.cur <= 'z'
416 || self.cur >= 'A' && self.cur <= 'Z'
417 || self.cur == '_' {
418 self.identbuf.push(self.cur);
419 self.next(i);
420 }
421 if self.identbuf == "true" {
422 self.tok = DeJsonTok::Bool(true);
423 return Ok(())
424 }
425 if self.identbuf == "false" {
426 self.tok = DeJsonTok::Bool(false);
427 return Ok(())
428 }
429 if self.identbuf == "null" {
430 self.tok = DeJsonTok::Null;
431 return Ok(())
432 }
433 self.tok = DeJsonTok::BareIdent;
434 Err(self.err_token(&format!("Got ##{}## needed true, false, null", self.identbuf)))
435 }
436 '"' => {
437 self.strbuf.clear();
438 self.next(i);
439 while self.cur != '"' {
440 if self.cur == '\\' {
441 self.next(i);
442 match self.cur{
443 'n'=>self.strbuf.push('\n'),
444 'r'=>self.strbuf.push('\r'),
445 't'=>self.strbuf.push('\t'),
446 '0'=>self.strbuf.push('\0'),
447 '\0'=>{
448 return Err(self.err_parse("string"));
449 },
450 _=>self.strbuf.push(self.cur)
451 }
452 self.next(i);
453 }
454 else{
455 if self.cur == '\0' {
456 return Err(self.err_parse("string"));
457 }
458 self.strbuf.push(self.cur);
459 self.next(i);
460 }
461 }
462 self.next(i);
463 self.tok = DeJsonTok::Str;
464 Ok(())
465 },
466 _ => {
467 Err(self.err_token("tokenizer"))
468 }
469 }
470 }
471}
472
473macro_rules!impl_ser_de_json_unsigned {
474 ( $ ty: ident, $ max: expr) => {
475 impl SerJson for $ ty {
476 fn ser_json(&self, _d: usize, s: &mut SerJsonState) {
477 s.out.push_str(&self.to_string());
478 }
479 }
480
481 impl DeJson for $ ty {
482 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result< $ ty,
483 DeJsonErr> {
484 let val = s.u64_range( $ max as u64) ?;
485 s.next_tok(i) ?;
486 return Ok(val as $ ty);
487 }
488 }
489 }
490}
491
492macro_rules!impl_ser_de_json_signed {
493 ( $ ty: ident, $ min: expr, $ max: expr) => {
494 impl SerJson for $ ty {
495 fn ser_json(&self, _d: usize, s: &mut SerJsonState) {
496 s.out.push_str(&self.to_string());
497 }
498 }
499
500 impl DeJson for $ ty {
501 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result< $ ty,
502 DeJsonErr> {
503 let val = s.i64_range( $ min as i64, $ max as i64) ?;
505 s.next_tok(i) ?;
506 return Ok(val as $ ty);
507 }
508 }
509 }
510}
511
512macro_rules!impl_ser_de_json_float {
513 ( $ ty: ident) => {
514 impl SerJson for $ ty {
515 fn ser_json(&self, _d: usize, s: &mut SerJsonState) {
516 s.out.push_str(&self.to_string());
517 }
518 }
519
520 impl DeJson for $ ty {
521 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result< $ ty,
522 DeJsonErr> {
523 let val = s.as_f64() ?;
525 s.next_tok(i) ?;
526 return Ok(val as $ ty);
527 }
528 }
529 }
530}
531
532impl_ser_de_json_unsigned!(usize, std::u64::MAX);
533impl_ser_de_json_unsigned!(u64, std::u64::MAX);
534impl_ser_de_json_unsigned!(u32, std::u32::MAX);
535impl_ser_de_json_unsigned!(u16, std::u16::MAX);
536impl_ser_de_json_unsigned!(u8, std::u8::MAX);
537impl_ser_de_json_signed!(i64, std::i64::MIN, std::i64::MAX);
538impl_ser_de_json_signed!(i32, std::i64::MIN, std::i64::MAX);
539impl_ser_de_json_signed!(i16, std::i64::MIN, std::i64::MAX);
540impl_ser_de_json_signed!(i8, std::i64::MIN, std::i8::MAX);
541impl_ser_de_json_float!(f64);
542impl_ser_de_json_float!(f32);
543
544impl<T> SerJson for Option<T> where T: SerJson {
545 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
546 if let Some(v) = self {
547 v.ser_json(d, s);
548 }
549 else {
550 s.out.push_str("None");
551 }
552 }
553}
554
555impl<T> DeJson for Option<T> where T: DeJson{
556 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Self,
557 DeJsonErr> {
558 if let DeJsonTok::Null = s.tok {
559 s.next_tok(i) ?;
560 return Ok(None)
561 }
562 Ok(Some(DeJson::de_json(s, i) ?))
563 }
564}
565
566impl SerJson for bool {
567 fn ser_json(&self, _d: usize, s: &mut SerJsonState) {
568 if *self {
569 s.out.push_str("true")
570 }
571 else {
572 s.out.push_str("false")
573 }
574 }
575}
576
577impl DeJson for bool {
578 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<bool, DeJsonErr> {
579 let val = s.as_bool() ?;
580 s.next_tok(i) ?;
581 Ok(val)
582 }
583}
584
585impl SerJson for String {
586 fn ser_json(&self, _d: usize, s: &mut SerJsonState) {
587 s.out.push('"');
588 for c in self.chars() {
589 match c{
590 '\n'=>{s.out.push('\\');s.out.push('n');},
591 '\r'=>{s.out.push('\\');s.out.push('r');},
592 '\t'=>{s.out.push('\\');s.out.push('t');},
593 '\0'=>{s.out.push('\\');s.out.push('0');},
594 '\\'=>{s.out.push('\\');s.out.push('\\');},
595 '"'=>{s.out.push('\\');s.out.push('"');},
596 _=>s.out.push(c)
597 }
598 }
599 s.out.push('"');
600 }
601}
602
603impl DeJson for String {
604 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<String, DeJsonErr> {
605 let val = s.as_string() ?;
606 s.next_tok(i) ?;
607 Ok(val)
608 }
609}
610
611impl<T> SerJson for Vec<T> where T: SerJson {
612 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
613 s.out.push('[');
614 if !self.is_empty(){
615 let last = self.len() -1;
616 for (index,item) in self.iter().enumerate() {
617 s.indent(d + 1);
618 item.ser_json(d + 1, s);
619 if index != last{
620 s.out.push(',');
621 }
622 }
623 }
624 s.out.push(']');
625 }
626}
627
628impl<T> DeJson for Vec<T> where T: DeJson {
629 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Vec<T>, DeJsonErr> {
630 let mut out = Vec::new();
631 s.block_open(i) ?;
632
633 while s.tok != DeJsonTok::BlockClose {
634 out.push(DeJson::de_json(s, i) ?);
635 s.eat_comma_block(i) ?;
636 }
637 s.block_close(i) ?;
638 Ok(out)
639 }
640}
641
642impl<T> SerJson for [T] where T: SerJson {
643 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
644 s.out.push('[');
645 let last = self.len() -1;
646 for (index,item) in self.iter().enumerate() {
647 item.ser_json(d + 1, s);
648 if index != last{
649 s.out.push(',');
650 }
651 }
652 s.out.push(']');
653 }
654}
655
656unsafe fn de_json_array_impl_inner<T>(top: *mut T, count: usize, s: &mut DeJsonState, i: &mut Chars) -> Result<(), DeJsonErr> where T:DeJson{
657 s.block_open(i) ?;
658 for c in 0..count {
659 top.add(c).write(DeJson::de_json(s, i) ?);
660 s.eat_comma_block(i) ?;
661 }
662 s.block_close(i) ?;
663 Ok(())
664}
665
666impl<T, const N: usize> DeJson for [T; N] where T: DeJson {
667 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Self,
668 DeJsonErr> {
669 unsafe{
670 let mut to = std::mem::MaybeUninit::<[T; N]>::uninit();
671 let top: *mut T = &mut to as *mut _ as *mut T;
672 de_json_array_impl_inner(top, N, s, i)?;
673 Ok(to.assume_init())
674 }
675 }
676}
677
678fn de_json_comma_block<T>(s: &mut DeJsonState, i: &mut Chars) -> Result<T, DeJsonErr> where T: DeJson {
679 let t = DeJson::de_json(s, i);
680 s.eat_comma_block(i) ?;
681 t
682}
683
684impl<A, B> SerJson for (A, B) where A: SerJson,
685B: SerJson {
686 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
687 s.out.push('[');
688 self.0.ser_json(d, s);
689 s.out.push(',');
690 self.1.ser_json(d, s);
691 s.out.push(']');
692 }
693}
694
695impl<A, B> DeJson for (A, B) where A: DeJson,
696B: DeJson {
697 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<(A, B), DeJsonErr> {
698 s.block_open(i) ?;
699 let r = (de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?);
700 s.block_close(i) ?;
701 Ok(r)
702 }
703}
704
705impl<A, B, C> SerJson for (A, B, C) where A: SerJson,
706B: SerJson,
707C: SerJson {
708 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
709 s.out.push('[');
710 self.0.ser_json(d, s);
711 s.out.push(',');
712 self.1.ser_json(d, s);
713 s.out.push(',');
714 self.2.ser_json(d, s);
715 s.out.push(']');
716 }
717}
718
719impl<A, B, C> DeJson for (A, B, C) where A: DeJson,
720B: DeJson,
721C: DeJson {
722 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<(A, B, C), DeJsonErr> {
723 s.block_open(i) ?;
724 let r = (de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?);
725 s.block_close(i) ?;
726 Ok(r)
727 }
728}
729
730impl<A, B, C, D> SerJson for (A, B, C, D) where A: SerJson,
731B: SerJson,
732C: SerJson,
733D: SerJson {
734 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
735 s.out.push('[');
736 self.0.ser_json(d, s);
737 s.out.push(',');
738 self.1.ser_json(d, s);
739 s.out.push(',');
740 self.2.ser_json(d, s);
741 s.out.push(',');
742 self.3.ser_json(d, s);
743 s.out.push(']');
744 }
745}
746
747impl<A, B, C, D> DeJson for (A, B, C, D) where A: DeJson,
748B: DeJson,
749C: DeJson,
750D: DeJson {
751 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<(A, B, C, D), DeJsonErr> {
752 s.block_open(i) ?;
753 let r = (de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?, de_json_comma_block(s, i) ?);
754 s.block_close(i) ?;
755 Ok(r)
756 }
757}
758
759impl<K, V> SerJson for HashMap<K, V> where K: SerJson,
760V: SerJson {
761 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
762 s.out.push('{');
763 let last = self.len() - 1;
764 for (index, (k, v)) in self.iter().enumerate() {
765 s.indent(d + 1);
766 k.ser_json(d + 1, s);
767 s.out.push(':');
768 v.ser_json(d + 1, s);
769 if index != last{
770 s.conl();
771 }
772 }
773 s.indent(d);
774 s.out.push('}');
775 }
776}
777
778impl<K, V> DeJson for HashMap<K, V> where K: DeJson + Eq + Hash,
779V: DeJson {
780 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Self,
781 DeJsonErr> {
782 let mut h = HashMap::new();
783 s.curly_open(i) ?;
784 while s.tok != DeJsonTok::CurlyClose {
785 let k = DeJson::de_json(s, i) ?;
786 s.colon(i) ?;
787 let v = DeJson::de_json(s, i) ?;
788 s.eat_comma_curly(i) ?;
789 h.insert(k, v);
790 }
791 s.curly_close(i) ?;
792 Ok(h)
793 }
794}
795
796impl<T> SerJson for Box<T> where T: SerJson {
797 fn ser_json(&self, d: usize, s: &mut SerJsonState) {
798 (**self).ser_json(d, s)
799 }
800}
801
802impl<T> DeJson for Box<T> where T: DeJson {
803 fn de_json(s: &mut DeJsonState, i: &mut Chars) -> Result<Box<T>, DeJsonErr> {
804 Ok(Box::new(DeJson::de_json(s, i) ?))
805 }
806}