Skip to main content

sonic_rs/serde/
de.rs

1//! Deserialize JSON data to a Rust data structure.
2
3// The code is cloned from [serde_json](https://github.com/serde-rs/json) and modified necessary parts.
4use 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
25//////////////////////////////////////////////////////////////////////////////
26
27/// A structure that deserializes JSON into Rust values.
28pub struct Deserializer<R> {
29    pub(crate) parser: Parser<R>,
30    scratch: Vec<u8>,
31    remaining_depth: u8,
32    shared: Option<Arc<Shared>>, // the shared allocator for `Value`
33}
34
35// some functions only used for struct visitors.
36impl<'de, R: Reader<'de>> Deserializer<R> {
37    /// Create a new deserializer.
38    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    /// Parse all number as [`crate::RawNumber`].
48    ///
49    /// # Example
50    /// ```
51    /// use sonic_rs::{Deserializer, Value};
52    /// let json = r#"{"a":1.2345678901234567890123}"#;
53    /// let mut de = Deserializer::from_str(json).use_rawnumber();
54    /// let value: Value = de.deserialize().unwrap();
55    /// let out = sonic_rs::to_string(&value).unwrap();
56    /// assert_eq!(json, out);
57    /// ```
58    pub fn use_rawnumber(mut self) -> Self {
59        self.parser.cfg.use_rawnumber = true;
60        self
61    }
62
63    /// Allow to parse JSON with invalid UTF-8 and UTF-16 characters. Will replace them with
64    /// `\uFFFD` (displayed as �).
65    ///
66    /// # Example
67    /// ```
68    /// use sonic_rs::{Deserializer, Value};
69    /// let data = [
70    ///     &[b'\"', 0xff, b'\"'][..],         // invalid UTF8 char in string
71    ///     br#"{"a":"\ud800","b":"\udc00"}"#, // invalid UTF16 surrogate pair
72    /// ];
73    /// let expect = [r#""�""#, r#"{"a":"�","b":"�"}"#];
74    ///
75    /// let mut exp = expect.iter();
76    /// for json in data {
77    ///     let mut de = Deserializer::from_slice(json).utf8_lossy();
78    ///     let value: Value = de.deserialize().unwrap();
79    ///     let out = sonic_rs::to_string(&value).unwrap();
80    ///     assert_eq!(&out, exp.next().unwrap());
81    /// }
82    /// ```
83    pub fn utf8_lossy(mut self) -> Self {
84        self.parser.cfg.utf8_lossy = true;
85        self
86    }
87
88    /// Deserialize a JSON stream to a Rust data structure.
89    ///
90    /// It can be used repeatedly and we do not check trailing chars after deserilalized.
91    ///
92    /// # Example
93    ///
94    /// ```
95    /// # use sonic_rs::{prelude::*, Value};
96    ///
97    /// use sonic_rs::Deserializer;
98    ///
99    /// let multiple_json = r#"{"a": 123, "b": "foo"} true [1, 2, 3] wrong chars"#;
100    ///
101    /// let mut deserializer = Deserializer::from_json(multiple_json);
102    ///
103    /// let val: Value = deserializer.deserialize().unwrap();
104    /// assert_eq!(val["a"].as_i64().unwrap(), 123);
105    /// assert_eq!(val["b"].as_str().unwrap(), "foo");
106    ///
107    /// let val: bool = deserializer.deserialize().unwrap();
108    /// assert_eq!(val, true);
109    ///
110    /// let val: Vec<u8> = deserializer.deserialize().unwrap();
111    /// assert_eq!(val, &[1, 2, 3]);
112    ///
113    /// // encounter the wrong chars in json
114    /// assert!(deserializer.deserialize::<Value>().is_err());
115    /// ```
116    pub fn deserialize<T>(&mut self) -> Result<T>
117    where
118        T: de::Deserialize<'de>,
119    {
120        de::Deserialize::deserialize(self)
121    }
122
123    /// Convert Deserializer to a [`StreamDeserializer`].
124    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    /// The `Deserializer::end` method should be called after a value has been fully deserialized.
134    /// This allows the `Deserializer` to validate that the input stream is at the end or that it
135    /// only has trailing whitespace.
136    pub fn end(&mut self) -> Result<()> {
137        tri!(self.parser.parse_trailing());
138        Ok(())
139    }
140}
141
142impl<'de> Deserializer<Read<'de>> {
143    /// Create a new deserializer from a json input [`JsonInput`].
144    pub fn from_json<I: JsonInput<'de>>(input: I) -> Self {
145        Self::new(Read::from(input))
146    }
147
148    /// Create a new deserializer from a string.
149    #[allow(clippy::should_implement_trait)]
150    pub fn from_str(s: &'de str) -> Self {
151        Self::new(Read::from(s))
152    }
153
154    /// Create a new deserializer from a string slice.
155    pub fn from_slice(s: &'de [u8]) -> Self {
156        Self::new(Read::from(s))
157    }
158}
159
160/// An iterator that deserializes a json stream into multiple `T` values.
161///
162/// # Example
163///
164/// ```
165/// use sonic_rs::{prelude::*, Deserializer, Value};
166///
167/// let multiple_json = r#"{"a": 123, "b": "foo"} true [1, 2, 3] wrong chars"#;
168///
169/// let mut stream = Deserializer::from_json(multiple_json).into_stream::<Value>();
170///
171/// let val = stream.next().unwrap().unwrap();
172/// assert_eq!(val["a"].as_i64().unwrap(), 123);
173/// assert_eq!(val["b"].as_str().unwrap(), "foo");
174///
175/// let val = stream.next().unwrap().unwrap();
176/// assert_eq!(val, true);
177///
178/// let val = stream.next().unwrap().unwrap();
179/// assert_eq!(val, &[1, 2, 3]);
180///
181/// // encounter the wrong chars in json
182/// assert!(stream.next().unwrap().is_err());
183/// ```
184pub 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
210// We only use our own error type; no need for From conversions provided by the
211// standard library's try! macro. This reduces lines of LLVM IR by 4%.
212macro_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    /// Ensures recursion depth limit; calls `f` with `self` and restores depth on return.
227    #[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
272// some functions only used for struct visitors.
273impl<'de, R: Reader<'de>> Deserializer<R> {
274    /// Fix error position for deserialized results.
275    #[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        // fixed error position if not matched type
294        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                // There can be only one leading '0'.
321                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        // #Safety
359        // the json is validate before parsing json, and we pass the document using visit_bytes
360        // here.
361        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            // will parse the JSON inplace
377            let cfg = self.parser.cfg;
378            let json = self.parser.read.as_u8_slice();
379
380            // get n to check trailing characters in later
381            let n = if cfg.utf8_lossy && self.parser.read.next_invalid_utf8() != usize::MAX {
382                // repr the invalid utf8, not need to care about the invalid UTF8 char in non-string
383                // parts, it will cause errors when parsing.
384                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                // Expose Arc allocation provenance for pack_shared's
397                // Arc::increment_strong_count (needs access via with_exposed_provenance).
398                ptr.expose_provenance();
399                &mut *(ptr as *mut _)
400            };
401            // deserialize some json parts into `Value`, not use padding buffer, avoid the memory
402            // copy
403            val.parse_without_padding(shared, &mut self.scratch, &mut self.parser)?
404        };
405
406        let val = ManuallyDrop::new(val);
407        // #Safety
408        // the json is validate before parsing json, and we pass the document using visit_bytes
409        // here.
410        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    // we deserialize json number from string or number types
418    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                // match the right quote
439                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            // The de::Error impl creates errors with unknown line and column.
500            // Fill in the position here by looking at the current index in the
501            // input. There is no way to tell whether this should call `error`
502            // or `error` so pick the one that seems correct more often.
503            // Worst case, the position is off by one character.
504            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    /// Deserialize f32 using a dedicated single-pass parser to avoid both
540    /// the f64→f32 rounding pitfall and the extra fallback parse.
541    ///
542    /// The f64→f32 cast can produce an off-by-one ULP error when the original
543    /// decimal is at a tie-breaking boundary (e.g., "17005001.000000000000130").
544    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    /// Parses a JSON string as bytes. Note that this function does not check
652    /// whether the bytes represent a valid UTF-8 string.
653    ///
654    /// Followed as `serde_json`.
655    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        // check invalid utf8 with allow space here
676        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    /// Parses a `null` as a None, and any other values as a `Some(...)`.
689    #[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    /// Parses a newtype struct as the underlying value.
731    #[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    /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either a straight
848    /// value, a `[..]`, or a `{..}`.
849    #[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        // Skip the ignored value with full validation.
889        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, // first is marked as
897}
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), // we will check the ending brace after `visit_seq`
914            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); // makes the error position is correct
924                    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
1124/// Only deserialize from this after peeking a '"' byte! Otherwise it may
1125/// deserialize invalid JSON successfully./// Only deserialize from this after peeking a '"' byte!
1126/// Otherwise it may deserialize invalid JSON successfully.
1127struct 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        // Map keys cannot be null.
1231        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}
1279//////////////////////////////////////////////////////////////////////////////
1280
1281fn from_trait<'de, R, T>(read: R) -> Result<T>
1282where
1283    R: Reader<'de>,
1284    T: de::Deserialize<'de>,
1285{
1286    // check JSON size, because the design of `sonic_rs::Value`, parsing JSON larger than 4 GB is
1287    // not supported
1288    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    // Make sure the whole stream has been consumed.
1309    tri!(de.parser.parse_trailing());
1310
1311    // check invalid utf8
1312    tri!(de.parser.read.check_utf8_final());
1313    Ok(value)
1314}
1315
1316/// Deserialize an instance of type `T` from bytes of JSON text.
1317/// If user can guarantee the JSON is valid UTF-8, recommend to use `from_slice_unchecked` instead.
1318pub 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
1325/// Deserialize an instance of type `T` from bytes of JSON text.
1326///
1327/// # Safety
1328/// The json passed in must be valid UTF-8.
1329pub 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
1336/// Deserialize an instance of type `T` from a string of JSON text.
1337pub 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
1344/// Deserialize an instance of type `T` from a Reader
1345pub 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        // MAX_ALLOWED_DEPTH is 255; nesting 256 levels returns RecursionLimitExceeded.
1365        // Use serde_json::Value so we go through the recursive path
1366        // (sonic_rs::Value may use a fast path when index==0).
1367        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}