Skip to main content

DeserializerConfig

Struct DeserializerConfig 

Source
pub struct DeserializerConfig { /* private fields */ }
Expand description

Configures how JSON is deserialized.

The configuration is independent of the input so it can be created once (even as a constant) and used for many inputs. The methods from_str and from_slice work like the functions of the same name. To create a Deserializer with the configuration use Deserializer::from_str_with_config or Deserializer::from_slice_with_config.

use deser_json::DeserializerConfig;

const CONFIG: DeserializerConfig =
    DeserializerConfig::new().exact_numbers(false);
let value: Vec<f64> = CONFIG.from_str("[0.10, 1e5]").unwrap();
assert_eq!(value, [0.1, 1e5]);

Implementations§

Source§

impl DeserializerConfig

Source

pub const fn new() -> DeserializerConfig

Creates the default configuration.

Source

pub const fn bytes(self, format: BytesFormat) -> DeserializerConfig

Sets how strings are decoded into bytes.

JSON has no bytes, types that expect bytes (like Vec<u8>) accept strings and sequences of integers instead. By default strings are decoded as base64, both with the standard and the URL-safe alphabet and with or without padding. This changes how strings are decoded, for BytesFormat::SEQ they are still decoded as base64.

let value: Vec<u8> =
    deser_json::from_str(r#""Af8=""#).unwrap();
assert_eq!(value, [1, 255]);
let value: Vec<u8> =
    deser_json::from_str(r#""Af8""#).unwrap();
assert_eq!(value, [1, 255]);
let value: Vec<u8> =
    deser_json::from_str("[1, 255]").unwrap();
assert_eq!(value, [1, 255]);

Strings in other encodings than base64 need this, for instance hex (BytesFormat::encoded::<deser_encoding::Hex>() with deser-encoding).

The format is placed into the state (see bytes). Values that use an adapter for bytes are not affected.

Source

pub const fn trailing(self, trailing: Trailing) -> DeserializerConfig

Controls what may follow a value.

By default (Trailing::Strict) only whitespace may follow the value. Trailing::Newline reads JSON Lines and Trailing::Stop stops after the value without looking at what follows:

use deser_json::{DeserializerConfig, Trailing};

assert!(
    deser_json::from_str::<Vec<u32>>("[1] trash")
        .is_err()
);
const STOP: DeserializerConfig =
    DeserializerConfig::new().trailing(Trailing::Stop);
assert_eq!(STOP.from_str::<Vec<u32>>("[1] trash").unwrap(), [1]);

With Trailing::Newline a Deserializer reads the lines one by one. Errors only discard their line:

use deser_json::{
    Deserializer, DeserializerConfig, Trailing,
};

const LINES: DeserializerConfig =
    DeserializerConfig::new().trailing(Trailing::Newline);
let mut de =
    Deserializer::from_str_with_config("1\n\nnope\n3\n", &LINES);
let mut values = Vec::new();
while !de.is_end() {
    match de.deserialize::<u32>() {
        Ok(value) => values.push(value),
        Err(err) => assert_eq!(err.line(), Some(3)),
    }
}
assert_eq!(values, [1, 3]);
Source

pub const fn track_locations(self, yes: bool) -> DeserializerConfig

Enables or disables location tracking.

The byte range of every event is always published into the state (see State::input_range). When enabled additionally the input is set as source (see Source) which allows resolving the ranges into lines and columns, for instance with the Spanned type of deser-location. This copies the input.

Source

pub const fn exact_numbers(self, yes: bool) -> DeserializerConfig

Enables or disables exact numbers.

When enabled (which is the default) floats which lose precision as f64 and integers that do not fit into 128 bits are emitted as Number extension values. These carry the text of the number together with its value as f64, which is what types that do not know about exact numbers receive. Types like Decimal (and the types of rust_decimal or bigdecimal) use the text to deserialize the number exactly:

use deser::ext::Decimal;

let value: Decimal =
    deser_json::from_str("0.10000000000000000001")
        .unwrap();
assert_eq!(value.as_str(), "0.10000000000000000001");
let value: f64 =
    deser_json::from_str("0.10000000000000000001")
        .unwrap();
assert_eq!(value, 0.1);

Floats whose text is the shortest representation of their value (as formatted by Debug, for instance 0.5 or 3.14) are emitted as plain floats as the text can be recovered from the value. This keeps the common case fast. When disabled, all floats are emitted as plain floats.

Source

pub fn from_str<'de, T: Deserialize<'de>>( &self, s: &'de str, ) -> Result<T, Error>

Deserializes JSON from the given string.

What may follow the value depends on trailing. With Trailing::Newline this reads the first line.

Source

pub fn from_slice<'de, T: Deserialize<'de>>( &self, bytes: &'de [u8], ) -> Result<T, Error>

Deserializes JSON from the given bytes.

The input must be UTF-8. Rather than validating the input upfront, the strings are validated while parsing (see Deserializer::from_slice).

Source§

impl DeserializerConfig

Source

pub fn reader<R: Read>(&self, reader: R) -> Reader<R, StreamDeserializer>

Creates a reader of a stream of values (see deser::io::Reader).

See StreamDeserializer for how the stream is split into values.

Source

pub fn from_reader<T: DeserializeOwned, R: Read>( &self, reader: R, ) -> Result<T, Error>

Deserializes a value from a reader.

See from_reader.

Trait Implementations§

Source§

impl Clone for DeserializerConfig

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DeserializerConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DeserializerConfig

Source§

fn default() -> DeserializerConfig

Returns the “default value” for a type. Read more
Source§

impl Eq for DeserializerConfig

Source§

impl PartialEq for DeserializerConfig

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for DeserializerConfig

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.