1use std::{marker::PhantomData, mem::ManuallyDrop, ptr::slice_from_raw_parts, sync::Arc};
5
6use serde::{
7 de::{self, Expected, Unexpected},
8 forward_to_deserialize_any,
9};
10use sonic_number::ParserNumber;
11
12use crate::{
13 error::{
14 Error,
15 ErrorCode::{self, EofWhileParsing, RecursionLimitExceeded},
16 Result,
17 },
18 parser::{as_str, ParseStatus, ParsedSlice, Parser, Reference},
19 reader::{Read, Reader},
20 value::{node::Value, shared::Shared},
21 JsonInput, OwnedLazyValue,
22};
23const MAX_ALLOWED_DEPTH: u8 = u8::MAX;
24
25pub struct Deserializer<R> {
29 pub(crate) parser: Parser<R>,
30 scratch: Vec<u8>,
31 remaining_depth: u8,
32 shared: Option<Arc<Shared>>, }
34
35impl<'de, R: Reader<'de>> Deserializer<R> {
37 pub fn new(read: R) -> Self {
39 Self {
40 parser: Parser::new(read),
41 scratch: Vec::new(),
42 remaining_depth: MAX_ALLOWED_DEPTH,
43 shared: Option::None,
44 }
45 }
46
47 pub fn use_rawnumber(mut self) -> Self {
59 self.parser.cfg.use_rawnumber = true;
60 self
61 }
62
63 pub fn utf8_lossy(mut self) -> Self {
84 self.parser.cfg.utf8_lossy = true;
85 self
86 }
87
88 pub fn deserialize<T>(&mut self) -> Result<T>
117 where
118 T: de::Deserialize<'de>,
119 {
120 de::Deserialize::deserialize(self)
121 }
122
123 pub fn into_stream<T>(self) -> StreamDeserializer<'de, T, R> {
125 StreamDeserializer {
126 de: self,
127 data: PhantomData,
128 lifetime: PhantomData,
129 is_ending: false,
130 }
131 }
132
133 pub fn end(&mut self) -> Result<()> {
137 tri!(self.parser.parse_trailing());
138 Ok(())
139 }
140}
141
142impl<'de> Deserializer<Read<'de>> {
143 pub fn from_json<I: JsonInput<'de>>(input: I) -> Self {
145 Self::new(Read::from(input))
146 }
147
148 #[allow(clippy::should_implement_trait)]
150 pub fn from_str(s: &'de str) -> Self {
151 Self::new(Read::from(s))
152 }
153
154 pub fn from_slice(s: &'de [u8]) -> Self {
156 Self::new(Read::from(s))
157 }
158}
159
160pub struct StreamDeserializer<'de, T, R> {
185 de: Deserializer<R>,
186 data: PhantomData<T>,
187 lifetime: PhantomData<&'de R>,
188 is_ending: bool,
189}
190
191impl<'de, T, R> Iterator for StreamDeserializer<'de, T, R>
192where
193 T: de::Deserialize<'de>,
194 R: Reader<'de>,
195{
196 type Item = Result<T>;
197
198 fn next(&mut self) -> Option<Self::Item> {
199 if self.is_ending {
200 return None;
201 }
202 let val: Result<T> = self.de.deserialize();
203 if val.is_err() {
204 self.is_ending = true;
205 }
206 Some(val)
207 }
208}
209
210macro_rules! tri {
213 ($e:expr $(,)?) => {
214 match $e {
215 Ok(val) => val,
216 Err(err) => {
217 return Err(err);
218 }
219 }
220 };
221}
222
223pub(crate) use tri;
224
225impl<'de, R: Reader<'de>> Deserializer<R> {
226 #[inline]
228 fn with_depth_limit<F, T>(&mut self, f: F) -> Result<T>
229 where
230 F: FnOnce(&mut Self) -> Result<T>,
231 {
232 self.remaining_depth -= 1;
233 if self.remaining_depth == 0 {
234 return Err(self.parser.error(RecursionLimitExceeded));
235 }
236 let result = f(self);
237 self.remaining_depth += 1;
238 result
239 }
240}
241
242fn visit_number<'de, V>(num: &ParserNumber, visitor: V) -> Result<V::Value>
243where
244 V: de::Visitor<'de>,
245{
246 match *num {
247 ParserNumber::Float(x) => visitor.visit_f64(x),
248 ParserNumber::Unsigned(x) => visitor.visit_u64(x),
249 ParserNumber::Signed(x) => visitor.visit_i64(x),
250 }
251}
252
253pub(crate) fn invalid_type_number(num: &ParserNumber, exp: &dyn Expected) -> Error {
254 match *num {
255 ParserNumber::Float(x) => de::Error::invalid_type(Unexpected::Float(x), exp),
256 ParserNumber::Unsigned(x) => de::Error::invalid_type(Unexpected::Unsigned(x), exp),
257 ParserNumber::Signed(x) => de::Error::invalid_type(Unexpected::Signed(x), exp),
258 }
259}
260
261macro_rules! impl_deserialize_number {
262 ($method:ident) => {
263 fn $method<V>(self, visitor: V) -> Result<V::Value>
264 where
265 V: de::Visitor<'de>,
266 {
267 self.deserialize_number(visitor)
268 }
269 };
270}
271
272impl<'de, R: Reader<'de>> Deserializer<R> {
274 #[inline]
276 fn fix_position<T>(&self, result: Result<T>) -> Result<T> {
277 result.map_err(|err| self.parser.fix_position(err))
278 }
279
280 pub(crate) fn deserialize_number<V>(&mut self, visitor: V) -> Result<V::Value>
281 where
282 V: de::Visitor<'de>,
283 {
284 let Some(peek) = self.parser.skip_space() else {
285 return Err(self.parser.error(EofWhileParsing));
286 };
287
288 let value = match peek {
289 c @ b'-' | c @ b'0'..=b'9' => visit_number(&tri!(self.parser.parse_number(c)), visitor),
290 _ => Err(self.peek_invalid_type(peek, &visitor)),
291 };
292
293 self.fix_position(value)
295 }
296
297 #[cold]
298 fn peek_invalid_type(&mut self, peek: u8, exp: &dyn Expected) -> Error {
299 self.parser.peek_invalid_type(peek, exp)
300 }
301
302 pub fn end_seq(&mut self) -> Result<()> {
303 self.parser.parse_array_end()
304 }
305
306 pub fn end_map(&mut self) -> Result<()> {
307 match self.parser.skip_space() {
308 Some(b'}') => Ok(()),
309 Some(b',') => Err(self.parser.error(ErrorCode::TrailingComma)),
310 Some(_) => Err(self.parser.error(ErrorCode::ExpectedObjectCommaOrEnd)),
311 None => Err(self.parser.error(ErrorCode::EofWhileParsing)),
312 }
313 }
314
315 fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
316 match self.parser.read.peek() {
317 Some(b'0') => {
318 buf.push('0');
319 self.parser.read.eat(1);
320 if let Some(ch) = self.parser.read.peek() {
322 if ch.is_ascii_digit() {
323 return Err(self.parser.error(ErrorCode::InvalidNumber));
324 }
325 }
326 Ok(())
327 }
328 Some(c) if c.is_ascii_digit() => {
329 buf.push(c as char);
330 self.parser.read.eat(1);
331 while let c @ b'0'..=b'9' = self.parser.read.peek().unwrap_or_default() {
332 self.parser.read.eat(1);
333 buf.push(c as char);
334 }
335 Ok(())
336 }
337 _ => Err(self.parser.error(ErrorCode::InvalidNumber)),
338 }
339 }
340
341 fn deserialize_lazyvalue<V>(&mut self, visitor: V) -> Result<V::Value>
342 where
343 V: de::Visitor<'de>,
344 {
345 let (raw, status) = self.parser.skip_one(true)?;
346 if status == ParseStatus::HasEscaped {
347 visitor.visit_str(as_str(raw))
348 } else {
349 visitor.visit_borrowed_str(as_str(raw))
350 }
351 }
352
353 fn deserialize_owned_lazyvalue<V>(&mut self, visitor: V) -> Result<V::Value>
354 where
355 V: de::Visitor<'de>,
356 {
357 let val = ManuallyDrop::new(self.parser.get_owned_lazyvalue(true)?);
358 unsafe {
362 let binary = &*slice_from_raw_parts(
363 &val as *const _ as *const u8,
364 std::mem::size_of::<OwnedLazyValue>(),
365 );
366 visitor.visit_bytes(binary)
367 }
368 }
369
370 fn deserialize_value<V>(&mut self, visitor: V) -> Result<V::Value>
371 where
372 V: de::Visitor<'de>,
373 {
374 let mut val = Value::new();
375 if self.parser.read.index() == 0 {
376 let cfg = self.parser.cfg;
378 let json = self.parser.read.as_u8_slice();
379
380 let n = if cfg.utf8_lossy && self.parser.read.next_invalid_utf8() != usize::MAX {
382 val.parse_with_padding(String::from_utf8_lossy(json).as_bytes(), cfg)?
385 } else {
386 val.parse_with_padding(json, cfg)?
387 };
388 self.parser.read.eat(n);
389 } else {
390 let shared = unsafe {
391 if self.shared.is_none() {
392 self.shared = Some(Arc::new(Shared::default()));
393 }
394 let shared = self.shared.as_mut().unwrap();
395 let ptr = Arc::as_ptr(shared);
396 ptr.expose_provenance();
399 &mut *(ptr as *mut _)
400 };
401 val.parse_without_padding(shared, &mut self.scratch, &mut self.parser)?
404 };
405
406 let val = ManuallyDrop::new(val);
407 unsafe {
411 let binary =
412 &*slice_from_raw_parts(&val as *const _ as *const u8, std::mem::size_of::<Value>());
413 visitor.visit_bytes(binary)
414 }
415 }
416
417 fn deserialize_rawnumber<V>(&mut self, visitor: V) -> Result<V::Value>
419 where
420 V: de::Visitor<'de>,
421 {
422 let raw = match self.parser.skip_space_peek() {
423 Some(c @ b'-' | c @ b'0'..=b'9') => {
424 self.parser.read.eat(1);
425 self.parser.skip_number(c)?
426 }
427 Some(b'"') => {
428 self.parser.read.eat(1);
429 let start = self.parser.read.index();
430 match self.parser.read.next() {
431 Some(c @ b'-' | c @ b'0'..=b'9') => {
432 self.parser.skip_number(c)?;
433 }
434 _ => return Err(self.parser.error(ErrorCode::InvalidNumber)),
435 }
436 let end = self.parser.read.index();
437 let raw = as_str(self.parser.read.slice_unchecked(start, end));
438 if self.parser.read.next() != Some(b'"') {
440 return Err(self.parser.error(ErrorCode::InvalidNumber));
441 }
442 raw
443 }
444 _ => return Err(self.parser.error(ErrorCode::InvalidNumber)),
445 };
446
447 visitor.visit_borrowed_str(raw)
448 }
449}
450
451impl<'de, 'a, R: Reader<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
452 type Error = Error;
453 #[inline]
454 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
455 where
456 V: de::Visitor<'de>,
457 {
458 let Some(peek) = self.parser.skip_space() else {
459 return Err(self.parser.error(EofWhileParsing));
460 };
461
462 let value = match peek {
463 b'n' => {
464 tri!(self.parser.parse_literal("ull"));
465 visitor.visit_unit()
466 }
467 b't' => {
468 tri!(self.parser.parse_literal("rue"));
469 visitor.visit_bool(true)
470 }
471 b'f' => {
472 tri!(self.parser.parse_literal("alse"));
473 visitor.visit_bool(false)
474 }
475 c @ b'-' | c @ b'0'..=b'9' => visit_number(&tri!(self.parser.parse_number(c)), visitor),
476 b'"' => match tri!(self.parser.parse_str(&mut self.scratch)) {
477 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
478 Reference::Copied(s) => visitor.visit_str(s),
479 },
480 b'[' => {
481 let ret = self.with_depth_limit(|de| visitor.visit_seq(SeqAccess::new(de)));
482 match (ret, self.end_seq()) {
483 (Ok(ret), Ok(())) => Ok(ret),
484 (Err(err), _) | (_, Err(err)) => Err(err),
485 }
486 }
487 b'{' => {
488 let ret = self.with_depth_limit(|de| visitor.visit_map(MapAccess::new(de)));
489 match (ret, self.end_map()) {
490 (Ok(ret), Ok(())) => Ok(ret),
491 (Err(err), _) | (_, Err(err)) => Err(err),
492 }
493 }
494 _ => Err(self.parser.error(ErrorCode::InvalidJsonValue)),
495 };
496
497 match value {
498 Ok(value) => Ok(value),
499 Err(err) => Err(self.parser.fix_position(err)),
505 }
506 }
507
508 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
509 where
510 V: de::Visitor<'de>,
511 {
512 let Some(peek) = self.parser.skip_space() else {
513 return Err(self.parser.error(ErrorCode::EofWhileParsing));
514 };
515
516 let value = match peek {
517 b't' => {
518 tri!(self.parser.parse_literal("rue"));
519 visitor.visit_bool(true)
520 }
521 b'f' => {
522 tri!(self.parser.parse_literal("alse"));
523 visitor.visit_bool(false)
524 }
525 _ => Err(self.peek_invalid_type(peek, &visitor)),
526 };
527
528 self.fix_position(value)
529 }
530
531 impl_deserialize_number!(deserialize_i8);
532 impl_deserialize_number!(deserialize_i16);
533 impl_deserialize_number!(deserialize_i32);
534 impl_deserialize_number!(deserialize_i64);
535 impl_deserialize_number!(deserialize_u8);
536 impl_deserialize_number!(deserialize_u16);
537 impl_deserialize_number!(deserialize_u32);
538 impl_deserialize_number!(deserialize_u64);
539 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
545 where
546 V: de::Visitor<'de>,
547 {
548 let Some(peek) = self.parser.skip_space() else {
549 return Err(self.parser.error(EofWhileParsing));
550 };
551
552 let value = match peek {
553 c @ b'-' | c @ b'0'..=b'9' => {
554 let f = tri!(self.parser.parse_float32(c));
555 visitor.visit_f32(f)
556 }
557 _ => Err(self.peek_invalid_type(peek, &visitor)),
558 };
559 self.fix_position(value)
560 }
561 impl_deserialize_number!(deserialize_f64);
562
563 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
564 where
565 V: de::Visitor<'de>,
566 {
567 let mut buf = String::new();
568 match self.parser.skip_space_peek() {
569 Some(b'-') => {
570 buf.push('-');
571 self.parser.read.eat(1);
572 }
573 Some(_) => {}
574 None => {
575 return Err(self.parser.error(ErrorCode::EofWhileParsing));
576 }
577 };
578
579 tri!(self.scan_integer128(&mut buf));
580
581 let value = match buf.parse() {
582 Ok(int) => visitor.visit_i128(int),
583 Err(_) => {
584 return Err(self.parser.error(ErrorCode::NumberOutOfRange));
585 }
586 };
587
588 self.fix_position(value)
589 }
590
591 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
592 where
593 V: de::Visitor<'de>,
594 {
595 match self.parser.skip_space_peek() {
596 Some(b'-') => {
597 return Err(self.parser.error(ErrorCode::NumberOutOfRange));
598 }
599 Some(_) => {}
600 None => {
601 return Err(self.parser.error(ErrorCode::EofWhileParsing));
602 }
603 }
604
605 let mut buf = String::new();
606 tri!(self.scan_integer128(&mut buf));
607
608 let value = match buf.parse() {
609 Ok(int) => visitor.visit_u128(int),
610 Err(_) => {
611 return Err(self.parser.error(ErrorCode::NumberOutOfRange));
612 }
613 };
614
615 self.fix_position(value)
616 }
617
618 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
619 where
620 V: de::Visitor<'de>,
621 {
622 self.deserialize_str(visitor)
623 }
624
625 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
626 where
627 V: de::Visitor<'de>,
628 {
629 let Some(peek) = self.parser.skip_space() else {
630 return Err(self.parser.error(ErrorCode::EofWhileParsing));
631 };
632
633 let value = match peek {
634 b'"' => match tri!(self.parser.parse_str(&mut self.scratch)) {
635 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
636 Reference::Copied(s) => visitor.visit_str(s),
637 },
638 _ => Err(self.peek_invalid_type(peek, &visitor)),
639 };
640
641 self.fix_position(value)
642 }
643
644 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
645 where
646 V: de::Visitor<'de>,
647 {
648 self.deserialize_str(visitor)
649 }
650
651 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
656 where
657 V: de::Visitor<'de>,
658 {
659 let Some(peek) = self.parser.skip_space() else {
660 return Err(self.parser.error(ErrorCode::EofWhileParsing));
661 };
662
663 let value = match peek {
664 b'"' => match tri!(self.parser.parse_string_raw(&mut self.scratch)) {
665 ParsedSlice::Borrowed { slice: b, buf: _ } => visitor.visit_borrowed_bytes(b),
666 ParsedSlice::Copied(b) => visitor.visit_bytes(b),
667 },
668 b'[' => {
669 self.parser.read.backward(1);
670 self.deserialize_seq(visitor)
671 }
672 _ => Err(self.peek_invalid_type(peek, &visitor)),
673 };
674
675 let _ = self.parser.check_invalid_utf8(true)?;
677 self.fix_position(value)
678 }
679
680 #[inline]
681 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
682 where
683 V: de::Visitor<'de>,
684 {
685 self.deserialize_bytes(visitor)
686 }
687
688 #[inline]
690 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
691 where
692 V: de::Visitor<'de>,
693 {
694 match self.parser.skip_space_peek() {
695 Some(b'n') => {
696 self.parser.read.eat(1);
697 tri!(self.parser.parse_literal("ull"));
698 visitor.visit_none()
699 }
700 _ => visitor.visit_some(self),
701 }
702 }
703
704 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
705 where
706 V: de::Visitor<'de>,
707 {
708 let Some(peek) = self.parser.skip_space() else {
709 return Err(self.parser.error(ErrorCode::EofWhileParsing));
710 };
711
712 let value = match peek {
713 b'n' => {
714 tri!(self.parser.parse_literal("ull"));
715 visitor.visit_unit()
716 }
717 _ => Err(self.peek_invalid_type(peek, &visitor)),
718 };
719
720 self.fix_position(value)
721 }
722
723 fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
724 where
725 V: de::Visitor<'de>,
726 {
727 self.deserialize_unit(visitor)
728 }
729
730 #[inline]
732 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
733 where
734 V: de::Visitor<'de>,
735 {
736 {
737 if name == crate::serde::rawnumber::TOKEN {
738 return self.deserialize_rawnumber(visitor);
739 } else if name == crate::lazyvalue::TOKEN {
740 return self.deserialize_lazyvalue(visitor);
741 } else if name == crate::lazyvalue::OWNED_LAZY_VALUE_TOKEN {
742 return self.deserialize_owned_lazyvalue(visitor);
743 } else if name == crate::value::de::TOKEN {
744 return self.deserialize_value(visitor);
745 }
746 }
747
748 let _ = name;
749 visitor.visit_newtype_struct(self)
750 }
751
752 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
753 where
754 V: de::Visitor<'de>,
755 {
756 let Some(peek) = self.parser.skip_space() else {
757 return Err(self.parser.error(ErrorCode::EofWhileParsing));
758 };
759
760 let value = match peek {
761 b'[' => {
762 let ret = self.with_depth_limit(|de| visitor.visit_seq(SeqAccess::new(de)));
763 match (ret, self.end_seq()) {
764 (Ok(ret), Ok(())) => Ok(ret),
765 (Err(err), _) | (_, Err(err)) => Err(err),
766 }
767 }
768 _ => return Err(self.peek_invalid_type(peek, &visitor)),
769 };
770 self.fix_position(value)
771 }
772
773 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
774 where
775 V: de::Visitor<'de>,
776 {
777 self.deserialize_seq(visitor)
778 }
779
780 fn deserialize_tuple_struct<V>(
781 self,
782 _name: &'static str,
783 _len: usize,
784 visitor: V,
785 ) -> Result<V::Value>
786 where
787 V: de::Visitor<'de>,
788 {
789 self.deserialize_seq(visitor)
790 }
791
792 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
793 where
794 V: de::Visitor<'de>,
795 {
796 let Some(peek) = self.parser.skip_space() else {
797 return Err(self.parser.error(ErrorCode::EofWhileParsing));
798 };
799
800 let value = match peek {
801 b'{' => {
802 let ret = self.with_depth_limit(|de| visitor.visit_map(MapAccess::new(de)));
803 match (ret, self.end_map()) {
804 (Ok(ret), Ok(())) => Ok(ret),
805 (Err(err), _) | (_, Err(err)) => Err(err),
806 }
807 }
808 _ => return Err(self.peek_invalid_type(peek, &visitor)),
809 };
810 self.fix_position(value)
811 }
812
813 fn deserialize_struct<V>(
814 self,
815 _name: &'static str,
816 _fields: &'static [&'static str],
817 visitor: V,
818 ) -> Result<V::Value>
819 where
820 V: de::Visitor<'de>,
821 {
822 let Some(peek) = self.parser.skip_space() else {
823 return Err(self.parser.error(ErrorCode::EofWhileParsing));
824 };
825
826 let value = match peek {
827 b'[' => {
828 let ret = self.with_depth_limit(|de| visitor.visit_seq(SeqAccess::new(de)));
829 match (ret, self.end_seq()) {
830 (Ok(ret), Ok(())) => Ok(ret),
831 (Err(err), _) | (_, Err(err)) => Err(err),
832 }
833 }
834 b'{' => {
835 let ret = self.with_depth_limit(|de| visitor.visit_map(MapAccess::new(de)));
836 match (ret, self.end_map()) {
837 (Ok(ret), Ok(())) => Ok(ret),
838 (Err(err), _) | (_, Err(err)) => Err(err),
839 }
840 }
841 _ => return Err(self.peek_invalid_type(peek, &visitor)),
842 };
843
844 self.fix_position(value)
845 }
846
847 #[inline]
850 fn deserialize_enum<V>(
851 self,
852 _name: &str,
853 _variants: &'static [&'static str],
854 visitor: V,
855 ) -> Result<V::Value>
856 where
857 V: de::Visitor<'de>,
858 {
859 match self.parser.skip_space_peek() {
860 Some(b'{') => {
861 self.parser.read.eat(1);
862 let value =
863 self.with_depth_limit(|de| visitor.visit_enum(VariantAccess::new(de)))?;
864
865 match self.parser.skip_space() {
866 Some(b'}') => Ok(value),
867 Some(_) => Err(self.parser.error(ErrorCode::InvalidJsonValue)),
868 None => Err(self.parser.error(ErrorCode::EofWhileParsing)),
869 }
870 }
871 Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)),
872 Some(_) => Err(self.parser.error(ErrorCode::InvalidJsonValue)),
873 None => Err(self.parser.error(ErrorCode::EofWhileParsing)),
874 }
875 }
876
877 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
878 where
879 V: de::Visitor<'de>,
880 {
881 self.deserialize_str(visitor)
882 }
883
884 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
885 where
886 V: de::Visitor<'de>,
887 {
888 tri!(self.parser.skip_one(true));
890 visitor.visit_unit()
891 }
892}
893
894pub struct SeqAccess<'a, R: 'a> {
895 de: &'a mut Deserializer<R>,
896 first: bool, }
898
899impl<'a, R: 'a> SeqAccess<'a, R> {
900 pub fn new(de: &'a mut Deserializer<R>) -> Self {
901 SeqAccess { de, first: true }
902 }
903}
904
905impl<'de, 'a, R: Reader<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
906 type Error = Error;
907
908 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
909 where
910 T: de::DeserializeSeed<'de>,
911 {
912 match self.de.parser.skip_space_peek() {
913 Some(b']') => Ok(None), Some(b',') if !self.first => {
915 self.de.parser.read.eat(1);
916 Ok(Some(tri!(seed.deserialize(&mut *self.de))))
917 }
918 Some(_) => {
919 if self.first {
920 self.first = false;
921 Ok(Some(tri!(seed.deserialize(&mut *self.de))))
922 } else {
923 self.de.parser.read.eat(1); Err(self.de.parser.error(ErrorCode::ExpectedArrayCommaOrEnd))
925 }
926 }
927 None => Err(self.de.parser.error(ErrorCode::EofWhileParsing)),
928 }
929 }
930}
931
932pub struct MapAccess<'a, R: 'a> {
933 de: &'a mut Deserializer<R>,
934 first: bool,
935}
936
937impl<'a, R: 'a> MapAccess<'a, R> {
938 pub fn new(de: &'a mut Deserializer<R>) -> Self {
939 MapAccess { de, first: true }
940 }
941}
942
943impl<'de, 'a, R: Reader<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
944 type Error = Error;
945
946 #[inline(always)]
947 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
948 where
949 K: de::DeserializeSeed<'de>,
950 {
951 let peek = match self.de.parser.skip_space_peek() {
952 Some(b'}') => {
953 return Ok(None);
954 }
955 Some(b',') if !self.first => {
956 self.de.parser.read.eat(1);
957 self.de.parser.skip_space()
958 }
959 Some(b) => {
960 self.de.parser.read.eat(1);
961 if self.first {
962 self.first = false;
963 Some(b)
964 } else {
965 return Err(self.de.parser.error(ErrorCode::ExpectedObjectCommaOrEnd));
966 }
967 }
968 None => {
969 return Err(self.de.parser.error(ErrorCode::EofWhileParsing));
970 }
971 };
972
973 match peek {
974 Some(b'"') => seed.deserialize(MapKey { de: &mut *self.de }).map(Some),
975 Some(b'}') => Err(self.de.parser.error(ErrorCode::TrailingComma)),
976 Some(_) => Err(self.de.parser.error(ErrorCode::ExpectObjectKeyOrEnd)),
977 None => Err(self.de.parser.error(ErrorCode::EofWhileParsing)),
978 }
979 }
980
981 #[inline(always)]
982 fn next_value<V>(&mut self) -> Result<V>
983 where
984 V: de::Deserialize<'de>,
985 {
986 use std::marker::PhantomData;
987 self.next_value_seed(PhantomData)
988 }
989
990 #[inline(always)]
991 fn next_entry<K, V>(&mut self) -> Result<Option<(K, V)>>
992 where
993 K: de::Deserialize<'de>,
994 V: de::Deserialize<'de>,
995 {
996 use std::marker::PhantomData;
997 self.next_entry_seed(PhantomData, PhantomData)
998 }
999
1000 #[inline(always)]
1001 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1002 where
1003 V: de::DeserializeSeed<'de>,
1004 {
1005 tri!(self.de.parser.parse_object_clo());
1006 seed.deserialize(&mut *self.de)
1007 }
1008}
1009
1010struct VariantAccess<'a, R: 'a> {
1011 de: &'a mut Deserializer<R>,
1012}
1013
1014impl<'a, R: 'a> VariantAccess<'a, R> {
1015 fn new(de: &'a mut Deserializer<R>) -> Self {
1016 VariantAccess { de }
1017 }
1018}
1019
1020impl<'de, 'a, R: Reader<'de> + 'a> de::EnumAccess<'de> for VariantAccess<'a, R> {
1021 type Error = Error;
1022 type Variant = Self;
1023
1024 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
1025 where
1026 V: de::DeserializeSeed<'de>,
1027 {
1028 let val = tri!(seed.deserialize(&mut *self.de));
1029 tri!(self.de.parser.parse_object_clo());
1030 Ok((val, self))
1031 }
1032}
1033
1034impl<'de, 'a, R: Reader<'de> + 'a> de::VariantAccess<'de> for VariantAccess<'a, R> {
1035 type Error = Error;
1036
1037 fn unit_variant(self) -> Result<()> {
1038 de::Deserialize::deserialize(self.de)
1039 }
1040
1041 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
1042 where
1043 T: de::DeserializeSeed<'de>,
1044 {
1045 seed.deserialize(self.de)
1046 }
1047
1048 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1049 where
1050 V: de::Visitor<'de>,
1051 {
1052 de::Deserializer::deserialize_seq(self.de, visitor)
1053 }
1054
1055 fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
1056 where
1057 V: de::Visitor<'de>,
1058 {
1059 de::Deserializer::deserialize_struct(self.de, "", fields, visitor)
1060 }
1061}
1062
1063struct UnitVariantAccess<'a, R: 'a> {
1064 de: &'a mut Deserializer<R>,
1065}
1066
1067impl<'a, R: 'a> UnitVariantAccess<'a, R> {
1068 fn new(de: &'a mut Deserializer<R>) -> Self {
1069 UnitVariantAccess { de }
1070 }
1071}
1072
1073impl<'de, 'a, R: Reader<'de> + 'a> de::EnumAccess<'de> for UnitVariantAccess<'a, R> {
1074 type Error = Error;
1075 type Variant = Self;
1076
1077 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
1078 where
1079 V: de::DeserializeSeed<'de>,
1080 {
1081 let variant = tri!(seed.deserialize(&mut *self.de));
1082 Ok((variant, self))
1083 }
1084}
1085
1086impl<'de, 'a, R: Reader<'de> + 'a> de::VariantAccess<'de> for UnitVariantAccess<'a, R> {
1087 type Error = Error;
1088
1089 fn unit_variant(self) -> Result<()> {
1090 Ok(())
1091 }
1092
1093 fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value>
1094 where
1095 T: de::DeserializeSeed<'de>,
1096 {
1097 Err(de::Error::invalid_type(
1098 Unexpected::UnitVariant,
1099 &"newtype variant",
1100 ))
1101 }
1102
1103 fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
1104 where
1105 V: de::Visitor<'de>,
1106 {
1107 Err(de::Error::invalid_type(
1108 Unexpected::UnitVariant,
1109 &"tuple variant",
1110 ))
1111 }
1112
1113 fn struct_variant<V>(self, _fields: &'static [&'static str], _visitor: V) -> Result<V::Value>
1114 where
1115 V: de::Visitor<'de>,
1116 {
1117 Err(de::Error::invalid_type(
1118 Unexpected::UnitVariant,
1119 &"struct variant",
1120 ))
1121 }
1122}
1123
1124struct MapKey<'a, R: 'a> {
1128 de: &'a mut Deserializer<R>,
1129}
1130
1131macro_rules! deserialize_numeric_key {
1132 ($method:ident) => {
1133 fn $method<V>(self, visitor: V) -> Result<V::Value>
1134 where
1135 V: de::Visitor<'de>,
1136 {
1137 let value = tri!(self.de.deserialize_number(visitor));
1138 if self.de.parser.read.next() != Some(b'"') {
1139 return Err(self.de.parser.error(ErrorCode::ExpectedQuote));
1140 }
1141
1142 Ok(value)
1143 }
1144 };
1145
1146 ($method:ident, $delegate:ident) => {
1147 fn $method<V>(self, visitor: V) -> Result<V::Value>
1148 where
1149 V: de::Visitor<'de>,
1150 {
1151 match self.de.parser.read.peek() {
1152 Some(b'0'..=b'9' | b'-') => {}
1153 _ => return Err(self.de.parser.error(ErrorCode::ExpectedNumericKey)),
1154 }
1155
1156 let value = tri!(self.de.$delegate(visitor));
1157
1158 if self.de.parser.read.next() != Some(b'"') {
1159 return Err(self.de.parser.error(ErrorCode::ExpectedQuote));
1160 }
1161
1162 Ok(value)
1163 }
1164 };
1165}
1166
1167impl<'de, 'a, R> de::Deserializer<'de> for MapKey<'a, R>
1168where
1169 R: Reader<'de>,
1170{
1171 type Error = Error;
1172
1173 #[inline]
1174 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1175 where
1176 V: de::Visitor<'de>,
1177 {
1178 self.de.scratch.clear();
1179 match tri!(self.de.parser.parse_str(&mut self.de.scratch)) {
1180 Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1181 Reference::Copied(s) => visitor.visit_str(s),
1182 }
1183 }
1184
1185 deserialize_numeric_key!(deserialize_i8);
1186 deserialize_numeric_key!(deserialize_i16);
1187 deserialize_numeric_key!(deserialize_i32);
1188 deserialize_numeric_key!(deserialize_i64);
1189 deserialize_numeric_key!(deserialize_i128, deserialize_i128);
1190 deserialize_numeric_key!(deserialize_u8);
1191 deserialize_numeric_key!(deserialize_u16);
1192 deserialize_numeric_key!(deserialize_u32);
1193 deserialize_numeric_key!(deserialize_u64);
1194 deserialize_numeric_key!(deserialize_u128, deserialize_u128);
1195 deserialize_numeric_key!(deserialize_f32, deserialize_f32);
1196 deserialize_numeric_key!(deserialize_f64);
1197
1198 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1199 where
1200 V: de::Visitor<'de>,
1201 {
1202 let mut value = match self.de.parser.read.next() {
1203 Some(b't') => {
1204 tri!(self.de.parser.parse_literal("rue"));
1205 visitor.visit_bool(true)
1206 }
1207 Some(b'f') => {
1208 tri!(self.de.parser.parse_literal("alse"));
1209 visitor.visit_bool(false)
1210 }
1211 None => Err(self.de.parser.error(ErrorCode::EofWhileParsing)),
1212 Some(peek) => Err(self.de.peek_invalid_type(peek, &visitor)),
1213 };
1214
1215 if self.de.parser.read.next() != Some(b'"') {
1216 value = Err(self.de.parser.error(ErrorCode::ExpectedQuote));
1217 }
1218
1219 match value {
1220 Ok(value) => Ok(value),
1221 Err(err) => Err(self.de.parser.fix_position(err)),
1222 }
1223 }
1224
1225 #[inline]
1226 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1227 where
1228 V: de::Visitor<'de>,
1229 {
1230 visitor.visit_some(self)
1232 }
1233
1234 #[inline]
1235 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1236 where
1237 V: de::Visitor<'de>,
1238 {
1239 visitor.visit_newtype_struct(self)
1240 }
1241
1242 #[inline]
1243 fn deserialize_enum<V>(
1244 self,
1245 name: &'static str,
1246 variants: &'static [&'static str],
1247 visitor: V,
1248 ) -> Result<V::Value>
1249 where
1250 V: de::Visitor<'de>,
1251 {
1252 self.de.parser.read.backward(1);
1253 self.de.deserialize_enum(name, variants, visitor)
1254 }
1255
1256 #[inline]
1257 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1258 where
1259 V: de::Visitor<'de>,
1260 {
1261 self.de.parser.read.backward(1);
1262 self.de.deserialize_bytes(visitor)
1263 }
1264
1265 #[inline]
1266 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1267 where
1268 V: de::Visitor<'de>,
1269 {
1270 self.de.parser.read.backward(1);
1271 self.de.deserialize_bytes(visitor)
1272 }
1273
1274 forward_to_deserialize_any! {
1275 char str string unit unit_struct seq tuple tuple_struct map struct
1276 identifier ignored_any
1277 }
1278}
1279fn from_trait<'de, R, T>(read: R) -> Result<T>
1282where
1283 R: Reader<'de>,
1284 T: de::Deserialize<'de>,
1285{
1286 let len = read.as_u8_slice().len();
1289 if len > u32::MAX as _ {
1290 return Err(crate::error::make_error(format!(
1291 "Only support JSON less than 4 GB, the input JSON is too large here, len is {len}"
1292 )));
1293 }
1294
1295 let mut de = Deserializer::new(read);
1296 #[cfg(feature = "arbitrary_precision")]
1297 {
1298 de = de.use_rawnumber();
1299 }
1300
1301 #[cfg(feature = "utf8_lossy")]
1302 {
1303 de = de.utf8_lossy();
1304 }
1305
1306 let value = tri!(de::Deserialize::deserialize(&mut de));
1307
1308 tri!(de.parser.parse_trailing());
1310
1311 tri!(de.parser.read.check_utf8_final());
1313 Ok(value)
1314}
1315
1316pub fn from_slice<'a, T>(json: &'a [u8]) -> Result<T>
1319where
1320 T: de::Deserialize<'a>,
1321{
1322 from_trait(Read::new(json, true))
1323}
1324
1325pub unsafe fn from_slice_unchecked<'a, T>(json: &'a [u8]) -> Result<T>
1330where
1331 T: de::Deserialize<'a>,
1332{
1333 from_trait(Read::new(json, false))
1334}
1335
1336pub fn from_str<'a, T>(s: &'a str) -> Result<T>
1338where
1339 T: de::Deserialize<'a>,
1340{
1341 from_trait(Read::new(s.as_bytes(), false))
1342}
1343
1344pub fn from_reader<R, T>(mut reader: R) -> Result<T>
1346where
1347 R: std::io::Read,
1348 T: de::DeserializeOwned,
1349{
1350 let mut data = Vec::new();
1351 if let Err(e) = reader.read_to_end(&mut data) {
1352 return Err(Error::io(e));
1353 };
1354 from_slice(data.as_slice())
1355}
1356
1357#[cfg(test)]
1358mod test {
1359 use crate::{object, Value};
1360
1361 #[cfg(not(target_family = "wasm"))]
1362 #[test]
1363 fn test_recursion_depth_limit() {
1364 std::thread::Builder::new()
1368 .name("test_recursion_depth_limit".to_string())
1369 .stack_size(16 * 1024 * 1024)
1370 .spawn(|| {
1371 let depth = 256;
1372 let src = format!("{}{}", "[".repeat(depth), "]".repeat(depth));
1373 let err = crate::from_str::<serde_json::Value>(&src).unwrap_err();
1374 assert!(matches!(
1375 err.error_code(),
1376 crate::error::ErrorCode::RecursionLimitExceeded
1377 ));
1378 })
1379 .expect("failed to spawn test thread")
1380 .join()
1381 .expect("test thread panicked");
1382 }
1383
1384 #[test]
1385 fn test_value_as_deserializer() {
1386 let json = r#"{"a": 1, "b": 2}"#;
1387 let mut de = crate::Deserializer::new(crate::Read::from(json));
1388
1389 let res: Value = de.deserialize().unwrap();
1390 assert_eq!(res, object! { "a": 1, "b": 2 });
1391 assert_eq!(de.parser.read.index, 16);
1392
1393 let res = de.end();
1394 assert!(res.is_ok());
1395
1396 let json = r#"{"a": 1, "b": 2}123"#;
1397 let mut de = crate::Deserializer::new(crate::Read::from(json));
1398
1399 let res: Value = de.deserialize().unwrap();
1400 assert_eq!(res, object! { "a": 1, "b": 2 });
1401 assert_eq!(de.parser.read.index, 16);
1402
1403 let res = de.end();
1404 assert!(res.is_err());
1405 }
1406}