1use serde::{
2 de,
3 de::{IntoDeserializer, Visitor}
4};
5use serde_json::value::{Map, Value};
6use std::convert::TryFrom;
7
8#[derive(Debug, thiserror::Error)]
9pub enum Error {
10 #[error("{0:}")]
11 Msg(String),
12 #[error("Not be able to deserialize from blank")]
13 Blank,
14 #[error("Incorrect type")]
15 TypeMismatch,
16 #[error("{0:} isn't supported")]
17 NotSupported(&'static str),
18 #[error(transparent)]
19 Serde(#[from] serde_json::Error)
20}
21
22impl de::Error for Error {
23 fn custom<T>(msg: T) -> Self
24 where
25 T: std::fmt::Display
26 {
27 Self::Msg(msg.to_string())
28 }
29}
30
31pub(crate) struct Deserializer<'de> {
32 stack: Vec<&'de Value>
33}
34
35impl<'de> Deserializer<'de> {
36 fn new(v: &'de Value) -> Self {
37 let stack = vec![v];
38 Self { stack }
39 }
40
41 fn pop(&mut self) -> Result<&'de Value, Error> { self.stack.pop().ok_or(Error::Blank) }
42}
43
44pub(crate) fn from_value<T>(v: &Value) -> Result<T, Error>
45where
46 T: de::DeserializeOwned
47{
48 let mut deserializer = Deserializer::new(v);
49 let t = T::deserialize(&mut deserializer)?;
50 Ok(t)
51}
52
53macro_rules! int {
54 ($t:ty, $base:ty) => {
55 paste::paste! {
56 fn [<deserialize_$t>]<V>(self, visitor: V) -> Result<V::Value, Self::Error>
57 where
58 V: Visitor<'de>
59 {
60 let v = self.pop()?;
61 let i1 = v.as_object()
62 .and_then(|m| m.get("n"))
63 .and_then(|v| v.[<as_$base>]())
64 .ok_or(Error::TypeMismatch);
65 let i2 = v.[<as_$base>]().ok_or(Error::TypeMismatch);
66 let i = i1.or(i2)?;
67 let i = $t::try_from(i).map_err(|_| Error::TypeMismatch)?;
68 visitor.[<visit_$t>](i)
69 }
70 }
71 };
72}
73
74impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
75 type Error = Error;
76
77 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
78 where
79 V: Visitor<'de>
80 {
81 log::trace!("any {:?}", self.stack);
82 let v = *self.stack.last().ok_or(Error::Blank)?;
83 match v {
84 Value::Null => self.deserialize_unit(visitor),
85 Value::Bool(_) => self.deserialize_bool(visitor),
86 Value::Number(x) if x.is_u64() => self.deserialize_u64(visitor),
87 Value::Number(x) if x.is_i64() => self.deserialize_i64(visitor),
88 Value::Number(x) if x.is_f64() => self.deserialize_f64(visitor),
89 Value::Number(_) => unreachable!(),
90 Value::String(_) => self.deserialize_str(visitor),
91 Value::Array(_) => self.deserialize_seq(visitor),
92 Value::Object(m) => {
93 if let Some(v) = m.get("v") {
94 match v.as_str() {
95 Some("Infinity") | Some("-Infinity") | Some("-0") | Some("NaN") => {
96 self.deserialize_f64(visitor)
97 }
98 Some("undefined") | Some("null") => self.deserialize_unit(visitor),
99 _ => {
100 let _ = self.pop()?;
101 self.stack.push(v);
102 self.deserialize_any(visitor)
103 }
104 }
105 } else if let Some(_a) = m.get("a") {
106 self.deserialize_seq(visitor)
107 } else if let Some(_o) = m.get("o") {
108 self.deserialize_map(visitor)
109 } else if let Some(n) = m.get("n") {
110 match n {
111 Value::Number(x) if x.is_u64() => self.deserialize_u64(visitor),
112 Value::Number(x) if x.is_i64() => self.deserialize_i64(visitor),
113 Value::Number(x) if x.is_f64() => self.deserialize_f64(visitor),
114 _ => {
115 log::error!("{:?}", n);
116 Err(Error::TypeMismatch)
117 }
118 }
119 } else if let Some(_s) = m.get("s") {
120 self.deserialize_str(visitor)
121 } else if let Some(_b) = m.get("b") {
122 self.deserialize_bool(visitor)
123 } else {
124 self.deserialize_map(visitor)
125 }
126 }
127 }
128 }
129
130 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
131 where
132 V: Visitor<'de>
133 {
134 let v = self.pop()?;
135 let b1 = v
136 .as_object()
137 .and_then(|m| m.get("b"))
138 .and_then(|v| v.as_bool())
139 .ok_or(Error::TypeMismatch);
140 let b2 = v.as_bool().ok_or(Error::TypeMismatch);
141 let b = b1.or(b2)?;
142 visitor.visit_bool(b)
143 }
144
145 int! {i8, i64}
146 int! {i16, i64}
147 int! {i32, i64}
148 int! {i64, i64}
149 int! {u8, u64}
150 int! {u16, u64}
151 int! {u32, u64}
152 int! {u64, u64}
153
154 fn deserialize_char<V>(self, _: V) -> Result<V::Value, Self::Error>
155 where
156 V: Visitor<'de>
157 {
158 Err(Error::NotSupported("deserialize_char"))
159 }
160
161 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
162 where
163 V: Visitor<'de>
164 {
165 Err(Error::NotSupported("deserialize_bytes"))
166 }
167
168 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
169 where
170 V: Visitor<'de>
171 {
172 Err(Error::NotSupported("deserialize_byte_buf"))
173 }
174
175 fn deserialize_f32<V>(self, _: V) -> Result<V::Value, Self::Error>
176 where
177 V: Visitor<'de>
178 {
179 Err(Error::NotSupported("deserialize_f32"))
180 }
181
182 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
183 where
184 V: Visitor<'de>
185 {
186 let v = self.pop()?;
187 let f1 = v
188 .as_object()
189 .and_then(|m| m.get("n"))
190 .and_then(|v| v.as_f64())
191 .ok_or(Error::TypeMismatch);
192 let f2 = v.as_f64().ok_or(Error::TypeMismatch);
193 let f3 = v
194 .as_object()
195 .and_then(|m| m.get("v"))
196 .and_then(|v| v.as_str())
197 .and_then(|s| match s {
198 "Infinity" => Some(f64::INFINITY),
199 "-Infinity" => Some(f64::NEG_INFINITY),
200 "-0" => Some(-0.0),
201 "NaN" => Some(f64::NAN),
202 _ => None
203 })
204 .ok_or(Error::TypeMismatch);
205 let f = f1.or(f2).or(f3)?;
206 visitor.visit_f64(f)
207 }
208
209 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
210 where
211 V: Visitor<'de>
212 {
213 log::trace!("str {:?}", self.stack);
214 let v = self.pop()?;
215 let s1 = v
216 .as_object()
217 .and_then(|m| m.get("s"))
218 .and_then(|v| v.as_str())
219 .ok_or(Error::TypeMismatch);
220 let s2 = v.as_str().ok_or(Error::TypeMismatch);
221 let s = s1.or(s2)?;
222 visitor.visit_borrowed_str(s)
223 }
224
225 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
226 where
227 V: Visitor<'de>
228 {
229 self.deserialize_str(visitor)
230 }
231
232 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
233 where
234 V: Visitor<'de>
235 {
236 let v = self.pop()?;
237 let n1 = v
238 .as_object()
239 .and_then(|m| m.get("v"))
240 .and_then(|v| v.as_str())
241 .and_then(|s| match s {
242 "undefined" => Some(()),
243 "null" => Some(()),
244 _ => None
245 });
246 let n2 = v.as_null();
247 let is_null = n1.or(n2).is_some();
248 if is_null {
249 visitor.visit_none()
250 } else {
251 self.stack.push(v);
252 visitor.visit_some(self)
253 }
254 }
255
256 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
257 where
258 V: Visitor<'de>
259 {
260 log::trace!("unit {:?}", self.stack);
261 let v = self.pop()?;
262 let n1 = v
263 .as_object()
264 .and_then(|m| m.get("v"))
265 .and_then(|v| v.as_str())
266 .and_then(|s| match s {
267 "undefined" => Some(()),
268 "null" => Some(()),
269 _ => None
270 });
271 let n2 = v.as_null();
272 let _ = n1.or(n2).ok_or(Error::TypeMismatch)?;
273 visitor.visit_unit()
274 }
275
276 fn deserialize_unit_struct<V>(
277 self,
278 _name: &'static str,
279 visitor: V
280 ) -> Result<V::Value, Self::Error>
281 where
282 V: Visitor<'de>
283 {
284 self.deserialize_unit(visitor)
285 }
286
287 fn deserialize_newtype_struct<V>(
288 self,
289 _name: &'static str,
290 visitor: V
291 ) -> Result<V::Value, Self::Error>
292 where
293 V: Visitor<'de>
294 {
295 visitor.visit_newtype_struct(self)
296 }
297
298 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
299 where
300 V: Visitor<'de>
301 {
302 let v = self.pop()?;
303 let a1 = v
304 .as_object()
305 .and_then(|m| m.get("a"))
306 .and_then(|v| v.as_array())
307 .ok_or(Error::TypeMismatch);
308 let a2 = v.as_array().ok_or(Error::TypeMismatch);
309 let a = a1.or(a2)?;
310 visitor.visit_seq(Array::new(&mut self, a))
311 }
312
313 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
314 where
315 V: Visitor<'de>
316 {
317 self.deserialize_seq(visitor)
318 }
319
320 fn deserialize_tuple_struct<V>(
321 self,
322 _name: &'static str,
323 _len: usize,
324 visitor: V
325 ) -> Result<V::Value, Self::Error>
326 where
327 V: Visitor<'de>
328 {
329 self.deserialize_seq(visitor)
330 }
331
332 fn deserialize_map<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
334 where
335 V: Visitor<'de>
336 {
337 let v = self.pop()?;
338 let m = v.as_object().ok_or(Error::TypeMismatch)?;
339 let o1 = m
340 .get("o")
341 .and_then(|v| v.as_array())
342 .ok_or(Error::TypeMismatch);
343 if m.contains_key("v") || m.contains_key("a") {
344 Err(Error::TypeMismatch)
345 } else if m.contains_key("d") {
346 visitor.visit_map(Object::new(&mut self, m))
347 } else if m.contains_key("o") {
348 visitor.visit_map(ObjectArr::new(&mut self, o1?))
349 } else if m.contains_key("n") || m.contains_key("s") || m.contains_key("b") {
350 Err(Error::TypeMismatch)
351 } else {
352 visitor.visit_map(Object::new(&mut self, m))
353 }
354 }
355
356 fn deserialize_struct<V>(
357 self,
358 _name: &'static str,
359 _fields: &'static [&'static str],
360 visitor: V
361 ) -> Result<V::Value, Self::Error>
362 where
363 V: Visitor<'de>
364 {
365 self.deserialize_map(visitor)
366 }
367
368 fn deserialize_enum<V>(
369 self,
370 _name: &'static str,
371 _variants: &'static [&'static str],
372 visitor: V
373 ) -> Result<V::Value, Self::Error>
374 where
375 V: Visitor<'de>
376 {
377 log::trace!("enum {:?}", self.stack);
378 let v = self.pop()?;
379 match v {
380 Value::String(s) => visitor.visit_enum(s.as_str().into_deserializer()),
381 Value::Object(m) => {
382 if let Some(s) = m.get("s") {
383 let s = s.as_str().ok_or(Error::TypeMismatch)?;
384 return visitor.visit_enum(s.into_deserializer());
385 }
386 visitor.visit_enum(Enum::new(self, m))
387 }
388 _ => Err(Error::TypeMismatch)
389 }
390 }
391
392 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
393 where
394 V: Visitor<'de>
395 {
396 self.deserialize_str(visitor)
397 }
398
399 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
400 where
401 V: Visitor<'de>
402 {
403 self.deserialize_any(visitor)
404 }
405}
406
407struct Array<'a, 'de: 'a> {
408 prime: &'a mut Deserializer<'de>,
409 data: std::slice::Iter<'de, Value>
410}
411
412impl<'a, 'de> Array<'a, 'de> {
413 fn new(prime: &'a mut Deserializer<'de>, arr: &'de [Value]) -> Self {
414 Array {
415 prime,
416 data: arr.iter()
417 }
418 }
419}
420
421impl<'de, 'a> de::SeqAccess<'de> for Array<'a, 'de> {
422 type Error = Error;
423
424 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
425 where
426 T: de::DeserializeSeed<'de>
427 {
428 let data = match self.data.next() {
429 Some(x) => x,
430 None => return Ok(None)
431 };
432 self.prime.stack.push(data);
433 seed.deserialize(&mut *self.prime).map(Some)
434 }
435}
436
437struct Object<'a, 'de: 'a> {
438 prime: &'a mut Deserializer<'de>,
439 keys: serde_json::map::Keys<'de>,
440 values: serde_json::map::Values<'de>
441}
442
443impl<'a, 'de> Object<'a, 'de> {
444 fn new(prime: &'a mut Deserializer<'de>, obj: &'de Map<String, Value>) -> Self {
445 Self {
446 prime,
447 keys: obj.keys(),
448 values: obj.values()
449 }
450 }
451}
452
453impl<'de, 'a> de::MapAccess<'de> for Object<'a, 'de> {
454 type Error = Error;
455
456 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
457 where
458 K: de::DeserializeSeed<'de>
459 {
460 let s = match self.keys.next() {
461 Some(x) => x,
462 None => return Ok(None)
463 };
464 let mut d = KeyDeserializer {
465 prime: &mut *self.prime,
466 s
467 };
468 Ok(Some(seed.deserialize(&mut d)?))
469 }
470
471 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
472 where
473 V: de::DeserializeSeed<'de>
474 {
475 let data = self.values.next().ok_or(Error::Blank)?;
476 self.prime.stack.push(data);
477 seed.deserialize(&mut *self.prime)
478 }
479}
480
481struct ObjectArr<'a, 'de: 'a> {
482 prime: &'a mut Deserializer<'de>,
483 arr: &'de [Value],
484 idx: usize
485}
486
487impl<'a, 'de> ObjectArr<'a, 'de> {
488 fn new(prime: &'a mut Deserializer<'de>, arr: &'de [Value]) -> Self {
489 Self { prime, arr, idx: 0 }
490 }
491}
492
493impl<'de, 'a> de::MapAccess<'de> for ObjectArr<'a, 'de> {
494 type Error = Error;
495
496 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
497 where
498 K: de::DeserializeSeed<'de>
499 {
500 let data = if self.idx < self.arr.len() {
501 self.idx += 1;
502 self.arr[self.idx - 1]
503 .as_object()
504 .and_then(|m| m.get("k"))
505 .ok_or(Error::Blank)?
506 } else {
507 return Ok(None);
508 };
509 let s = data.as_str().ok_or(Error::TypeMismatch)?;
510 let mut d = KeyDeserializer {
511 prime: &mut *self.prime,
512 s
513 };
514 Ok(Some(seed.deserialize(&mut d)?))
515 }
516
517 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
518 where
519 V: de::DeserializeSeed<'de>
520 {
521 let data = self.arr[self.idx - 1]
522 .as_object()
523 .and_then(|m| m.get("v"))
524 .ok_or(Error::Blank)?;
525 self.prime.stack.push(data);
526 seed.deserialize(&mut *self.prime)
527 }
528}
529
530struct KeyDeserializer<'a, 'de: 'a> {
531 prime: &'a mut Deserializer<'de>,
532 s: &'de str
533}
534
535macro_rules! key_int {
536 ($t:ty, $base:ty) => {
537 paste::paste! {
538 fn [<deserialize_$t>]<V>(self, visitor: V) -> Result<V::Value, Self::Error>
539 where
540 V: Visitor<'de>
541 {
542 let i: $t = serde_json::from_str(self.s)?;
543 visitor.[<visit_$t>](i)
544 }
545 }
546 };
547}
548
549impl<'de, 'a> de::Deserializer<'de> for &'a mut KeyDeserializer<'a, 'de> {
550 type Error = Error;
551
552 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
553 where
554 V: Visitor<'de>
555 {
556 visitor.visit_str(self.s)
557 }
558
559 forward_to_deserialize_any! {
560 bool f32 f64 char str string unit unit_struct seq tuple tuple_struct map
561 struct identifier ignored_any
562 }
563
564 key_int! {i8, i64}
565 key_int! {i16, i64}
566 key_int! {i32, i64}
567 key_int! {i64, i64}
568 key_int! {u8, u64}
569 key_int! {u16, u64}
570 key_int! {u32, u64}
571 key_int! {u64, u64}
572
573 fn deserialize_bytes<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
574 where
575 V: Visitor<'de>
576 {
577 Err(Error::NotSupported("deserialize_bytes"))
578 }
579
580 fn deserialize_byte_buf<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
581 where
582 V: Visitor<'de>
583 {
584 Err(Error::NotSupported("deserialize_byte_buf"))
585 }
586
587 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
588 where
589 V: Visitor<'de>
590 {
591 visitor.visit_some(self)
592 }
593
594 fn deserialize_newtype_struct<V>(
595 self,
596 _name: &'static str,
597 visitor: V
598 ) -> Result<V::Value, Self::Error>
599 where
600 V: Visitor<'de>
601 {
602 visitor.visit_newtype_struct(self)
603 }
604
605 fn deserialize_enum<V>(
606 self,
607 name: &'static str,
608 variants: &'static [&'static str],
609 visitor: V
610 ) -> Result<V::Value, Self::Error>
611 where
612 V: Visitor<'de>
613 {
614 self.prime.deserialize_enum(name, variants, visitor)
615 }
616}
617
618struct Enum<'a, 'de: 'a> {
619 prime: &'a mut Deserializer<'de>,
620 map: &'de Map<String, Value>
621}
622
623impl<'a, 'de> Enum<'a, 'de> {
624 fn new(prime: &'a mut Deserializer<'de>, map: &'de Map<String, Value>) -> Self {
625 Enum { prime, map }
626 }
627}
628
629impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
630 type Error = Error;
631 type Variant = Self;
632
633 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
634 where
635 V: de::DeserializeSeed<'de>
636 {
637 log::trace!("variant_seed {:?}", self.map);
638 if let Some(a) = self.map.get("o") {
639 let a = a.as_array().ok_or(Error::Blank)?;
640 if a.len() == 1 {
641 let key = a[0].get("k").ok_or(Error::Blank)?;
642 self.prime.stack.push(key);
643 let v = seed.deserialize(&mut *self.prime)?;
644 self.prime.stack.push(a[0].get("v").ok_or(Error::Blank)?);
645 Ok((v, self))
646 } else {
647 Err(Error::TypeMismatch)
648 }
649 } else {
650 Err(Error::TypeMismatch)
651 }
652 }
653}
654
655impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
656 type Error = Error;
657
658 fn unit_variant(self) -> Result<(), Self::Error> {
659 let v = self.prime.pop()?;
660 if v.is_null() {
661 Ok(())
662 } else {
663 Err(Error::TypeMismatch)
664 }
665 }
666
667 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
668 where
669 T: de::DeserializeSeed<'de>
670 {
671 seed.deserialize(self.prime)
672 }
673
674 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
675 where
676 V: Visitor<'de>
677 {
678 de::Deserializer::deserialize_seq(self.prime, visitor)
679 }
680
681 fn struct_variant<V>(
682 self,
683 _fields: &'static [&'static str],
684 visitor: V
685 ) -> Result<V::Value, Self::Error>
686 where
687 V: Visitor<'de>
688 {
689 de::Deserializer::deserialize_map(self.prime, visitor)
690 }
691}
692
693#[cfg(test)]
694mod tests {
695 use super::*;
696 use std::collections::HashMap;
697
698 #[test]
699 fn r#struct() {
700 env_logger::builder().is_test(true).try_init().ok();
701 #[derive(Debug, Deserialize, PartialEq)]
702 struct Test {
703 a: i32,
704 b: Option<i32>,
705 c: Option<String>,
706 d: f64,
707 e: Vec<Value>,
708 mi: HashMap<i32, String>,
709 ms: HashMap<String, String>
710 }
711 let v = serde_json::from_str(
712 r#"{ "o": [
713 { "k": "a", "v": { "n": 3 } },
714 {"k":"c","v":{"s":"sdf"}},
715 {"k":"d","v":{"v":"Infinity"}},
716 {"k": "e", "v": {"a": [{"n": 2.0}, {"b": false}]}},
717 {"k": "ms", "v": {"o": [{"k": "2", "v": "as"}]}},
718 {"k": "mi", "v": {"o": [{"k": "2", "v": "as"}]}}
719 ] }"#
720 )
721 .unwrap();
722 let de: Test = from_value(&v).unwrap();
723 let mi = {
724 let mut m = HashMap::new();
725 m.insert(2, "as".into());
726 m
727 };
728 let ms = {
729 let mut m = HashMap::new();
730 m.insert("2".into(), "as".into());
731 m
732 };
733 assert_eq!(
734 de,
735 Test {
736 a: 3,
737 b: None,
738 c: Some("sdf".into()),
739 d: f64::INFINITY,
740 e: vec![Value::from(2.0f64), Value::from(false)],
741 mi,
742 ms
743 }
744 );
745 let v = serde_json::from_str(r#"{"v": "null"}"#).unwrap();
746 let de: Option<String> = from_value(&v).unwrap();
747 assert_eq!(de, None);
748 }
749
750 #[test]
751 fn r#enum() {
752 env_logger::builder().is_test(true).try_init().ok();
753 #[derive(Debug, Deserialize, PartialEq)]
754 enum Test {
755 A,
756 B(i32),
757 Tuple(u32, u32),
758 Struct { a: u32 }
759 }
760 let v = serde_json::from_str(r#"{"s": "A"}"#).unwrap();
761 let de: Test = from_value(&v).unwrap();
762 assert_eq!(de, Test::A);
763 let v = serde_json::from_str(r#"{"o": [{"k":"B", "v": {"n":0}}]}"#).unwrap();
764 let de: Test = from_value(&v).unwrap();
765 assert_eq!(de, Test::B(0));
766 let v = serde_json::from_str(r#"{"o": [{"k":"Tuple", "v": {"a": [{"n":0}, {"n":3}]}}]}"#)
767 .unwrap();
768 let de: Test = from_value(&v).unwrap();
769 assert_eq!(de, Test::Tuple(0, 3));
770 let v = serde_json::from_str(
771 r#"{"o": [{"k":"Struct", "v": {"o": [{"k":"a", "v": {"n":0}}]}}]}"#
772 )
773 .unwrap();
774 let de: Test = from_value(&v).unwrap();
775 assert_eq!(de, Test::Struct { a: 0 });
776 }
777}