Trait FromRawJsonValue

Source
pub trait FromRawJsonValue<'text>: Sized {
    // Required method
    fn from_raw_json_value(
        value: RawJsonValue<'text, '_>,
    ) -> Result<Self, JsonParseError>;
}
Expand description

Converts a raw JSON value to a specific Rust type.

This trait allows for extracting typed values from untyped RawJsonValue representations, performing necessary type checking and conversions.

Implementing this trait enables a type to be deserialized from JSON data. Once a type implements FromRawJsonValue, you can use Json to parse JSON text to that type through Rust’s standard FromStr trait.

§Examples

Parse a JSON array to a vector of integers:

use nojson::{Json, RawJson, JsonParseError};

// Parse a JSON text via `str::parse()`.
let numbers: Json<[u32; 3]> = "[1, 2, 3]".parse()?;
assert_eq!(numbers.0, [1, 2, 3]);

// Alternatively, you can use `RawJson::parse()`,
// which offers a more flexible approach for converting JSON values and
// generating context-rich error messages.
let raw = RawJson::parse("[1, 2, 3]")?;

// For types that implement the `FromRawJsonValue` trait,
// the `RawJsonValue::try_to()` method can be used for conversion.
let numbers: [u32; 3] = raw.value().try_to()?;
assert_eq!(numbers, [1, 2, 3]);

Parse a JSON object to a custom struct (requires implementing FromRawJsonValue for your struct):

use nojson::{Json, RawJsonValue, JsonParseError, FromRawJsonValue};

struct Person {
    name: String,
    age: u32,
}

impl<'text> FromRawJsonValue<'text> for Person {
    fn from_raw_json_value(value: RawJsonValue<'text, '_>) -> Result<Self, JsonParseError> {
        let ([name, age], []) = value.to_fixed_object(["name","age"],[])?;
        Ok(Person {
            name: name.try_to()?,
            age: age.try_to()?,
        })
    }
}

let person: Json<Person> = r#"{"name":"Alice","age":30}"#.parse()?;
assert_eq!(person.0.name, "Alice");
assert_eq!(person.0.age, 30);

Parse a rational number represented as a JSON string:

use nojson::{Json, RawJsonValue, JsonParseError, FromRawJsonValue};
use std::str::FromStr;

#[derive(Debug, PartialEq)]
struct Rational {
    numerator: i32,
    denominator: i32,
}

impl<'text> FromRawJsonValue<'text> for Rational {
    fn from_raw_json_value(value: RawJsonValue<'text, '_>) -> Result<Self, JsonParseError> {
        // Get the raw string content of the JSON value.
        let fraction_str = value.to_unquoted_string_str()?;

        // Split by the '/' character and parse components.
        let parts: Vec<&str> = fraction_str.split('/').collect();
        if parts.len() != 2 {
            return Err(JsonParseError::invalid_value(value, "Expected format 'numerator/denominator'"));
        }

        let numerator = parts[0].parse()
            .map_err(|_| JsonParseError::invalid_value(value, "Invalid numerator"))?;
        let denominator = parts[1].parse()
            .map_err(|_| JsonParseError::invalid_value(value, "Invalid denominator"))?;

        if denominator == 0 {
            return Err(JsonParseError::invalid_value(value, "Denominator cannot be zero"));
        }

        Ok(Rational { numerator, denominator })
    }
}

let fraction: Json<Rational> = r#""3/4""#.parse()?;
assert_eq!(fraction.0, Rational { numerator: 3, denominator: 4 });

Required Methods§

Source

fn from_raw_json_value( value: RawJsonValue<'text, '_>, ) -> Result<Self, JsonParseError>

Attempts to convert a raw JSON value to this type.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'text> FromRawJsonValue<'text> for Cow<'text, str>

Source§

impl<'text> FromRawJsonValue<'text> for IpAddr

Source§

impl<'text> FromRawJsonValue<'text> for SocketAddr

Source§

impl<'text> FromRawJsonValue<'text> for bool

Source§

impl<'text> FromRawJsonValue<'text> for f32

Source§

impl<'text> FromRawJsonValue<'text> for f64

Source§

impl<'text> FromRawJsonValue<'text> for i8

Source§

impl<'text> FromRawJsonValue<'text> for i16

Source§

impl<'text> FromRawJsonValue<'text> for i32

Source§

impl<'text> FromRawJsonValue<'text> for i64

Source§

impl<'text> FromRawJsonValue<'text> for i128

Source§

impl<'text> FromRawJsonValue<'text> for isize

Source§

impl<'text> FromRawJsonValue<'text> for u8

Source§

impl<'text> FromRawJsonValue<'text> for u16

Source§

impl<'text> FromRawJsonValue<'text> for u32

Source§

impl<'text> FromRawJsonValue<'text> for u64

Source§

impl<'text> FromRawJsonValue<'text> for u128

Source§

impl<'text> FromRawJsonValue<'text> for ()

Source§

impl<'text> FromRawJsonValue<'text> for usize

Source§

impl<'text> FromRawJsonValue<'text> for String

Source§

impl<'text> FromRawJsonValue<'text> for Ipv4Addr

Source§

impl<'text> FromRawJsonValue<'text> for Ipv6Addr

Source§

impl<'text> FromRawJsonValue<'text> for SocketAddrV4

Source§

impl<'text> FromRawJsonValue<'text> for SocketAddrV6

Source§

impl<'text> FromRawJsonValue<'text> for PathBuf

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroI8

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroI16

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroI32

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroI64

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroI128

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroIsize

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroU8

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroU16

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroU32

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroU64

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroU128

Source§

impl<'text> FromRawJsonValue<'text> for NonZeroUsize

Source§

impl<'text, K, V> FromRawJsonValue<'text> for BTreeMap<K, V>
where K: FromStr + Ord, K::Err: Into<Box<dyn Send + Sync + Error>>, V: FromRawJsonValue<'text>,

Source§

impl<'text, K, V> FromRawJsonValue<'text> for HashMap<K, V>
where K: FromStr + Eq + Hash, K::Err: Into<Box<dyn Send + Sync + Error>>, V: FromRawJsonValue<'text>,

Source§

impl<'text, T0: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0,)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>, T3: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2, T3)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>, T3: FromRawJsonValue<'text>, T4: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2, T3, T4)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>, T3: FromRawJsonValue<'text>, T4: FromRawJsonValue<'text>, T5: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2, T3, T4, T5)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>, T3: FromRawJsonValue<'text>, T4: FromRawJsonValue<'text>, T5: FromRawJsonValue<'text>, T6: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2, T3, T4, T5, T6)

Source§

impl<'text, T0: FromRawJsonValue<'text>, T1: FromRawJsonValue<'text>, T2: FromRawJsonValue<'text>, T3: FromRawJsonValue<'text>, T4: FromRawJsonValue<'text>, T5: FromRawJsonValue<'text>, T6: FromRawJsonValue<'text>, T7: FromRawJsonValue<'text>> FromRawJsonValue<'text> for (T0, T1, T2, T3, T4, T5, T6, T7)

Source§

impl<'text, T> FromRawJsonValue<'text> for Box<T>
where T: FromRawJsonValue<'text>,

Source§

impl<'text, T> FromRawJsonValue<'text> for BTreeSet<T>
where T: FromRawJsonValue<'text> + Ord,

Source§

impl<'text, T> FromRawJsonValue<'text> for HashSet<T>
where T: FromRawJsonValue<'text> + Eq + Hash,

Source§

impl<'text, T: FromRawJsonValue<'text>> FromRawJsonValue<'text> for Option<T>

Source§

impl<'text, T: FromRawJsonValue<'text>> FromRawJsonValue<'text> for VecDeque<T>

Source§

impl<'text, T: FromRawJsonValue<'text>> FromRawJsonValue<'text> for Vec<T>

Source§

impl<'text, T: FromRawJsonValue<'text>, const N: usize> FromRawJsonValue<'text> for [T; N]

Implementors§