Trait value_ext::JsonValueExt

source ·
pub trait JsonValueExt {
    // Required methods
    fn x_new_object() -> Value;
    fn x_get<T: DeserializeOwned>(
        &self,
        name_or_pointer: &str,
    ) -> Result<T, JsonValueExtError>;
    fn x_get_as<'a, T: AsType<'a>>(
        &'a self,
        name_or_pointer: &str,
    ) -> Result<T, JsonValueExtError>;
    fn x_take<T: DeserializeOwned>(
        &mut self,
        name_or_pointer: &str,
    ) -> Result<T, JsonValueExtError>;
    fn x_insert<T: Serialize>(
        &mut self,
        name_or_pointer: &str,
        value: T,
    ) -> Result<(), JsonValueExtError>;
    fn x_walk<F>(&mut self, callback: F) -> bool
       where F: FnMut(&mut Map<String, Value>, &str) -> bool;
    fn x_pretty(&self) -> Result<String, JsonValueExtError>;
}
Expand description

Extension trait for working with JSON values in a more convenient way.

JsonValueExt offers convenient methods for interacting with serde_json::Value objects, simplifying tasks like getting, taking, inserting, traversing, and pretty-printing JSON data while ensuring type safety with Serde’s serialization and deserialization.

§Provided Methods

  • x_get: Returns a value of a specified type T from a JSON object using either a direct name or a pointer path.
  • x_take: Takes a value from a JSON object using a specified name or pointer path, replacing it with Null.
  • x_insert: Inserts a value of type T into a JSON object at the specified name or pointer path, creating any missing objects along the way.
  • x_walk: Traverses all properties within the JSON value tree, applying a user-provided callback function on each property.
  • x_pretty: Returns a pretty-printed string representation of the JSON value.

§Usage

This trait is intended to be used with serde_json::Value objects. It is particularly useful when you need to manipulate JSON structures dynamically or when the structure of the JSON is not known at compile time.

use serde_json::{Value, Map};
use serde::de::DeserializeOwned;
use serde::Serialize;
use your_crate::JsonValueExt;

fn example_usage(json: &mut Value) -> Result<(), Box<dyn std::error::Error>> {
    // Get a value from JSON
    let name: String = json.x_get("/name")?;

    // Take a value from JSON, replacing it with `Null`
    let age: u32 = json.x_take("age")?;

    // Insert a new value into JSON
    json.x_insert("city", "New York")?;

    // Walk through the JSON properties
    json.x_walk(|parent_map, property_name| {
        println!("Property: {}", property_name);
        true // Continue traversal
    });

    // Get a pretty-printed JSON string
    let pretty_json = json.x_pretty()?;
    println!("{}", pretty_json);

    Ok(())
}

This trait enhances the serde_json::Value API by adding more type-safe and convenient methods for manipulating JSON data in Rust.

Required Methods§

source

fn x_new_object() -> Value

source

fn x_get<T: DeserializeOwned>( &self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

Returns an owned type T for a given name or pointer path.

  • name_or_pointer: Can be a direct name or a pointer path (if it starts with ‘/’).
source

fn x_get_as<'a, T: AsType<'a>>( &'a self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

Returns a reference of type T (or value for copy type) for a given name or pointer path. Use this one over x_get to avoid string allocation, and get only the &str

  • name_or_pointer: Can be a direct name or a pointer path (if it starts with ‘/’).
source

fn x_take<T: DeserializeOwned>( &mut self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

Takes the value at the specified name or pointer path and replaces it with Null.

  • name_or_pointer: Can be a direct name or a pointer path (if it starts with ‘/’).
source

fn x_insert<T: Serialize>( &mut self, name_or_pointer: &str, value: T, ) -> Result<(), JsonValueExtError>

Inserts a new value of type T at the specified name or pointer path. This method creates missing Value::Object entries as needed.

  • name_or_pointer: Can be a direct name or a pointer path (if it starts with ‘/’).
source

fn x_walk<F>(&mut self, callback: F) -> bool
where F: FnMut(&mut Map<String, Value>, &str) -> bool,

Walks through all properties in the JSON value tree and calls the callback function on each.

  • The callback signature is (parent_map, property_name) -> bool.
    • Returns false to stop the traversal; returns true to continue.

Returns:

  • true if the traversal completes without stopping early.
  • false if the traversal is stopped early because the callback returned false.
source

fn x_pretty(&self) -> Result<String, JsonValueExtError>

Returns a pretty-printed string representation of the JSON value.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl JsonValueExt for Value

source§

fn x_walk<F>(&mut self, callback: F) -> bool
where F: FnMut(&mut Map<String, Value>, &str) -> bool,

Walks through all properties of a JSON value tree and calls the callback function on each property.

  • The callback signature is (parent_map, property_name) -> bool.
    • Return false from the callback to stop the traversal; return true to continue.

Returns:

  • true if the traversal completed to the end without being stopped early.
  • false if the traversal was stopped early because the callback returned false.
source§

fn x_new_object() -> Value

source§

fn x_get<T: DeserializeOwned>( &self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

source§

fn x_get_as<'a, T: AsType<'a>>( &'a self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

source§

fn x_take<T: DeserializeOwned>( &mut self, name_or_pointer: &str, ) -> Result<T, JsonValueExtError>

source§

fn x_insert<T: Serialize>( &mut self, name_or_pointer: &str, value: T, ) -> Result<(), JsonValueExtError>

source§

fn x_pretty(&self) -> Result<String, JsonValueExtError>

Implementors§