Struct serde_json::Deserializer
source · [−]pub struct Deserializer<R> { /* private fields */ }
Expand description
A structure that deserializes JSON into Rust values.
Implementations
sourceimpl<'de, R> Deserializer<R> where
R: Read<'de>,
impl<'de, R> Deserializer<R> where
R: Read<'de>,
sourceimpl<R> Deserializer<IoRead<R>> where
R: Read,
impl<R> Deserializer<IoRead<R>> where
R: Read,
sourcepub fn from_reader(reader: R) -> Self
pub fn from_reader(reader: R) -> Self
Creates a JSON deserializer from an io::Read
.
Reader-based deserializers do not support deserializing borrowed types
like &str
, since the std::io::Read
trait has no non-copying methods
– everything it does involves copying bytes out of the data source.
sourceimpl<'a> Deserializer<SliceRead<'a>>
impl<'a> Deserializer<SliceRead<'a>>
sourcepub fn from_slice(bytes: &'a [u8]) -> Self
pub fn from_slice(bytes: &'a [u8]) -> Self
Creates a JSON deserializer from a &[u8]
.
sourceimpl<'a> Deserializer<StrRead<'a>>
impl<'a> Deserializer<StrRead<'a>>
sourceimpl<'de, R: Read<'de>> Deserializer<R>
impl<'de, R: Read<'de>> Deserializer<R>
sourcepub fn end(&mut self) -> Result<()>
pub fn end(&mut self) -> Result<()>
The Deserializer::end
method should be called after a value has been fully deserialized.
This allows the Deserializer
to validate that the input stream is at the end or that it
only has trailing whitespace.
sourcepub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>ⓘNotable traits for StreamDeserializer<'de, R, T>impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T> where
R: Read<'de>,
T: Deserialize<'de>, type Item = Result<T>;
where
T: Deserialize<'de>,
pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>ⓘNotable traits for StreamDeserializer<'de, R, T>impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T> where
R: Read<'de>,
T: Deserialize<'de>, type Item = Result<T>;
where
T: Deserialize<'de>,
R: Read<'de>,
T: Deserialize<'de>, type Item = Result<T>;
Turn a JSON deserializer into an iterator over values of type T.
sourcepub fn disable_recursion_limit(&mut self)
pub fn disable_recursion_limit(&mut self)
Parse arbitrarily deep JSON structures without any consideration for overflowing the stack.
You will want to provide some other way to protect against stack overflows, such as by wrapping your Deserializer in the dynamically growing stack adapter provided by the serde_stacker crate. Additionally you will need to be careful around other recursive operations on the parsed result which may overflow the stack after deserialization has completed, including, but not limited to, Display and Debug and Drop impls.
This method is only available if serde_json is built with the
"unbounded_depth"
feature.
Examples
use serde::Deserialize;
use serde_json::Value;
fn main() {
let mut json = String::new();
for _ in 0..10000 {
json = format!("[{}]", json);
}
let mut deserializer = serde_json::Deserializer::from_str(&json);
deserializer.disable_recursion_limit();
let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
let value = Value::deserialize(deserializer).unwrap();
carefully_drop_nested_arrays(value);
}
fn carefully_drop_nested_arrays(value: Value) {
let mut stack = vec![value];
while let Some(value) = stack.pop() {
if let Value::Array(array) = value {
stack.extend(array);
}
}
}
Trait Implementations
sourceimpl<'de, 'a, R: Read<'de>> Deserializer<'de> for &'a mut Deserializer<R>
impl<'de, 'a, R: Read<'de>> Deserializer<'de> for &'a mut Deserializer<R>
sourcefn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Parses a JSON string as bytes. Note that this function does not check whether the bytes represent a valid UTF-8 string.
The relevant part of the JSON specification is Section 8.2 of RFC 7159:
When all the strings represented in a JSON text are composed entirely of Unicode characters (however escaped), then that JSON text is interoperable in the sense that all software implementations that parse it will agree on the contents of names and of string values in objects and arrays.
However, the ABNF in this specification allows member names and string values to contain bit sequences that cannot encode Unicode characters; for example, “\uDEAD” (a single unpaired UTF-16 surrogate). Instances of this have been observed, for example, when a library truncates a UTF-16 string without checking whether the truncation split a surrogate pair. The behavior of software that receives JSON texts containing such values is unpredictable; for example, implementations might return different values for the length of a string value or even suffer fatal runtime exceptions.
The behavior of serde_json is specified to fail on non-UTF-8 strings when deserializing into Rust UTF-8 string types such as String, and succeed with non-UTF-8 bytes when deserializing using this method.
Escape sequences are processed as usual, and for \uXXXX
escapes it is
still checked if the hex number represents a valid Unicode code point.
Examples
You can use this to parse JSON strings containing invalid UTF-8 bytes, or unpaired surrogates.
use serde_bytes::ByteBuf;
fn look_at_bytes() -> Result<(), serde_json::Error> {
let json_data = b"\"some bytes: \xe5\x00\xe5\"";
let bytes: ByteBuf = serde_json::from_slice(json_data)?;
assert_eq!(b'\xe5', bytes[12]);
assert_eq!(b'\0', bytes[13]);
assert_eq!(b'\xe5', bytes[14]);
Ok(())
}
Backslash escape sequences like \n
are still interpreted and required
to be valid. \u
escape sequences are required to represent a valid
Unicode code point or lone surrogate.
use serde_bytes::ByteBuf;
fn look_at_bytes() -> Result<(), serde_json::Error> {
let json_data = b"\"lone surrogate: \\uD801\"";
let bytes: ByteBuf = serde_json::from_slice(json_data)?;
let expected = b"lone surrogate: \xED\xA0\x81";
assert_eq!(expected, bytes.as_slice());
Ok(())
}
sourcefn deserialize_option<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Parses a null
as a None, and any other values as a Some(...)
.
sourcefn deserialize_newtype_struct<V>(
self,
name: &str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_newtype_struct<V>(
self,
name: &str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
Parses a newtype struct as the underlying value.
sourcefn deserialize_enum<V>(
self,
_name: &str,
_variants: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_enum<V>(
self,
_name: &str,
_variants: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
Parses an enum as an object like {"$KEY":$VALUE}
, where $VALUE is either a straight
value, a [..]
, or a {..}
.
type Error = Error
type Error = Error
The error type that can be returned if some error occurs during deserialization. Read more
sourcefn deserialize_any<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Require the Deserializer
to figure out how to drive the visitor based
on what data type is in the input. Read more
sourcefn deserialize_bool<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a bool
value.
sourcefn deserialize_i8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an i8
value.
sourcefn deserialize_i16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an i16
value.
sourcefn deserialize_i32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an i32
value.
sourcefn deserialize_i64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an i64
value.
sourcefn deserialize_u8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a u8
value.
sourcefn deserialize_u16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a u16
value.
sourcefn deserialize_u32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a u32
value.
sourcefn deserialize_u64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a u64
value.
sourcefn deserialize_f32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a f32
value.
sourcefn deserialize_f64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a f64
value.
sourcefn deserialize_i128<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an i128
value. Read more
sourcefn deserialize_u128<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting an u128
value. Read more
sourcefn deserialize_char<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a char
value.
sourcefn deserialize_str<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a string value and does
not benefit from taking ownership of buffered data owned by the
Deserializer
. Read more
sourcefn deserialize_string<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a string value and would
benefit from taking ownership of buffered data owned by the
Deserializer
. Read more
sourcefn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a byte array and would
benefit from taking ownership of buffered data owned by the
Deserializer
. Read more
sourcefn deserialize_unit<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a unit value.
sourcefn deserialize_unit_struct<V>(
self,
_name: &'static str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_unit_struct<V>(
self,
_name: &'static str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a unit struct with a
particular name. Read more
sourcefn deserialize_seq<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a sequence of values.
sourcefn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a sequence of values and
knows how many values there are without looking at the serialized data. Read more
sourcefn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a tuple struct with a
particular name and number of fields. Read more
sourcefn deserialize_map<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a map of key-value pairs.
sourcefn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting a struct with a particular
name and fields. Read more
sourcefn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type is expecting the name of a struct
field or the discriminant of an enum variant. Read more
sourcefn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
Hint that the Deserialize
type needs to deserialize a value whose type
doesn’t matter because it is ignored. Read more
sourcefn is_human_readable(&self) -> bool
fn is_human_readable(&self) -> bool
Determine whether Deserialize
implementations should expect to
deserialize their human-readable form. Read more
Auto Trait Implementations
impl<R> RefUnwindSafe for Deserializer<R> where
R: RefUnwindSafe,
impl<R> Send for Deserializer<R> where
R: Send,
impl<R> Sync for Deserializer<R> where
R: Sync,
impl<R> Unpin for Deserializer<R> where
R: Unpin,
impl<R> UnwindSafe for Deserializer<R> where
R: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more