json-tools-rs


Namejson-tools-rs JSON
Version 0.7.0 PyPI version JSON
download
home_pageNone
SummaryHigh-performance JSON manipulation library with SIMD-accelerated parsing and automatic type conversion
upload_time2025-10-17 16:39:19
maintainerNone
docs_urlNone
authorJSON Tools RS Contributors
requires_python>=3.8
licenseMIT OR Apache-2.0
keywords json flatten manipulation parsing rust simd performance
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # JSON Tools RS

A high-performance Rust library for advanced JSON manipulation with SIMD-accelerated parsing, providing unified flattening and unflattening operations through a clean builder pattern API.

[![Crates.io](https://img.shields.io/crates/v/json-tools-rs.svg)](https://crates.io/crates/json-tools-rs)
[![Documentation](https://docs.rs/json-tools-rs/badge.svg)](https://docs.rs/json-tools-rs)
[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](LICENSE-MIT)

## Why JSON Tools RS?

JSON Tools RS is designed for developers who need to:
- **Transform nested JSON** into flat structures for databases, CSV exports, or analytics
- **Clean and normalize** JSON data from external APIs or user input
- **Process large batches** of JSON documents efficiently
- **Maintain type safety** with perfect roundtrip support (flatten β†’ unflatten β†’ original)
- **Work with both Rust and Python** using the same consistent API

Unlike simple JSON parsers, JSON Tools RS provides a complete toolkit for JSON transformation with production-ready performance and error handling.

## Features

- πŸš€ **Unified API**: Single `JSONTools` entry point for flattening, unflattening, or pass-through transforms (`.normal()`)
- πŸ”§ **Builder Pattern**: Fluent, chainable API for easy configuration and method chaining
- ⚑ **High Performance**: SIMD-accelerated JSON parsing with FxHashMap and optimized memory allocations
- πŸš„ **Parallel Processing**: Built-in Rayon-based parallelism for 3-5x speedup on batch operations (automatic, no configuration needed)
- 🎯 **Complete Roundtrip**: Flatten JSON and unflatten back to original structure with perfect fidelity
- 🧹 **Comprehensive Filtering**: Remove empty strings, nulls, empty objects, and empty arrays (works for both flatten and unflatten)
- πŸ”„ **Advanced Replacements**: Literal and regex-based key/value replacements using standard Rust regex syntax
- πŸ›‘οΈ **Collision Handling**: Intelligent `.handle_key_collision(true)` to collect colliding values into arrays
- πŸ”€ **Automatic Type Conversion**: Convert strings to numbers and booleans with `.auto_convert_types(true)` - handles currency, thousands separators, scientific notation
- πŸ“¦ **Batch Processing**: Process single JSON or batches; Python also supports dicts and lists of dicts
- 🐍 **Python Bindings**: Full Python support with perfect type preservation (input type = output type)
- 🧰 **Robust Errors**: Comprehensive `JsonToolsError` enum with helpful suggestions for debugging
- πŸ”₯ **Performance Optimizations**: FxHashMap (~15-30% faster), SIMD parsing, Cow-based string handling, and automatic parallel processing

## Table of Contents

- [Why JSON Tools RS?](#why-json-tools-rs)
- [Features](#features)
- [Quick Start](#quick-start)
  - [Rust Examples](#rust---unified-jsontools-api)
  - [Python Examples](#python---unified-jsontools-api)
- [Quick Reference](#quick-reference)
- [Installation](#installation)
- [Performance](#performance)
- [API Reference](#api-reference)
  - [Core Methods](#core-methods)
  - [Configuration Methods](#configuration-methods)
  - [Input/Output Types](#inputoutput-types)
- [Error Handling](#error-handling)
- [Common Use Cases](#common-use-cases)
- [Examples and Testing](#examples-and-testing)
- [Limitations and Known Issues](#limitations-and-known-issues)
- [FAQ](#frequently-asked-questions-faq)
- [Contributing](#contributing)
- [License](#license)
- [Changelog](#changelog)

## Quick Start

### Rust - Unified JSONTools API

The `JSONTools` struct provides a unified builder pattern API for all JSON manipulation operations. Simply call `.flatten()` or `.unflatten()` to set the operation mode, then chain configuration methods and call `.execute()`.

#### Basic Flattening

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let json = r#"{"user": {"name": "John", "profile": {"age": 30, "city": "NYC"}}}"#;
let result = JSONTools::new()
    .flatten()
    .execute(json)?;

if let JsonOutput::Single(flattened) = result {
    println!("{}", flattened);
}
// Output: {"user.name": "John", "user.profile.age": 30, "user.profile.city": "NYC"}
```

#### Advanced Flattening with Filtering

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let json = r#"{"user": {"name": "John", "details": {"age": null, "city": ""}}}"#;
let result = JSONTools::new()
    .flatten()
    .separator("::")
    .lowercase_keys(true)
    .key_replacement("(User|Admin)_", "")
    .value_replacement("@example.com", "@company.org")
    .remove_empty_strings(true)
    .remove_nulls(true)
    .remove_empty_objects(true)
    .remove_empty_arrays(true)
    .execute(json)?;

if let JsonOutput::Single(flattened) = result {
    println!("{}", flattened);
}
// Output: {"user::name": "John"}
```

#### Basic Unflattening

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let flattened = r#"{"user.name": "John", "user.profile.age": 30}"#;
let result = JSONTools::new()
    .unflatten()
    .execute(flattened)?;

match result {
    JsonOutput::Single(unflattened) => println!("{}", unflattened),
    JsonOutput::Multiple(_) => unreachable!(),
}
// Output: {"user": {"name": "John", "profile": {"age": 30}}}
```

#### Advanced Unflattening with Configuration

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let flattened = r#"{"user::name": "John", "user::age": 30, "user::email": ""}"#;
let result = JSONTools::new()
    .unflatten()
    .separator("::")
    .lowercase_keys(true)
    .remove_empty_strings(true)
    .remove_nulls(true)
    .execute(flattened)?;

match result {
    JsonOutput::Single(unflattened) => println!("{}", unflattened),
    JsonOutput::Multiple(_) => unreachable!(),
}
// Output: {"user": {"name": "John", "age": 30}}
```

#### Key Collision Handling

When transformations make different keys end up identical, enable collision handling to collect values into arrays.

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let json = r#"{"user_name": "John", "admin_name": "Jane"}"#;
let result = JSONTools::new()
    .flatten()
    .key_replacement("(user|admin)_", "") // both become "name"
    .handle_key_collision(true)                    // collect colliding values
    .execute(json)?;

if let JsonOutput::Single(flattened) = result {
    println!("{}", flattened);
}
// Output: {"name": ["John", "Jane"]}
```

#### Automatic Type Conversion

Convert string values to numbers and booleans automatically for data cleaning and normalization.

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let json = r#"{
    "id": "123",
    "price": "$1,234.56",
    "quantity": "1,000",
    "active": "true",
    "verified": "FALSE",
    "name": "Product"
}"#;

let result = JSONTools::new()
    .flatten()
    .auto_convert_types(true)
    .execute(json)?;

if let JsonOutput::Single(flattened) = result {
    println!("{}", flattened);
}
// Output: {
//   "id": 123,
//   "price": 1234.56,
//   "quantity": 1000,
//   "active": true,
//   "verified": false,
//   "name": "Product"  // Keeps as string (not a valid number or boolean)
// }
```

#### Perfect Roundtrip Support

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let original = r#"{"user": {"name": "John", "age": 30}, "items": [1, 2, {"nested": "value"}]}"#;

// Flatten
let flattened = JSONTools::new().flatten().execute(original)?;
let flattened_str = match flattened { JsonOutput::Single(s) => s, _ => unreachable!() };

// Unflatten back to original structure
let restored = JSONTools::new().unflatten().execute(&flattened_str)?;
let restored_str = match restored { JsonOutput::Single(s) => s, _ => unreachable!() };

// Verify perfect roundtrip
assert_eq!(
    serde_json::from_str::<serde_json::Value>(original)?,
    serde_json::from_str::<serde_json::Value>(&restored_str)?
);
```


### Python - Unified JSONTools API

The Python bindings provide the same unified `JSONTools` API with **perfect type matching**: input type equals output type. This makes the API predictable and easy to use.

#### Type Preservation Examples

```python
import json_tools_rs as jt

# Example 1: dict input β†’ dict output
result = jt.JSONTools().flatten().execute({"user": {"name": "John", "age": 30}})
print(result)  # {'user.name': 'John', 'user.age': 30}
print(type(result))  # <class 'dict'>

# Example 2: JSON string input β†’ JSON string output
result = jt.JSONTools().flatten().execute('{"user": {"name": "John", "age": 30}}')
print(result)  # '{"user.name": "John", "user.age": 30}'
print(type(result))  # <class 'str'>

# Example 3: List[dict] input β†’ List[dict] output
batch = [{"a": {"b": 1}}, {"c": {"d": 2}}]
result = jt.JSONTools().flatten().execute(batch)
print(result)  # [{'a.b': 1}, {'c.d': 2}]
print(type(result[0]))  # <class 'dict'>

# Example 4: List[str] input β†’ List[str] output
batch = ['{"a": {"b": 1}}', '{"c": {"d": 2}}']
result = jt.JSONTools().flatten().execute(batch)
print(result)  # ['{"a.b": 1}', '{"c.d": 2}']
print(type(result[0]))  # <class 'str'>
```

#### Basic Usage

```python
import json_tools_rs as jt

# Basic flattening - dict input β†’ dict output
result = jt.JSONTools().flatten().execute({"user": {"name": "John", "age": 30}})
print(result)  # {'user.name': 'John', 'user.age': 30}

# Basic unflattening - dict input β†’ dict output
result = jt.JSONTools().unflatten().execute({"user.name": "John", "user.age": 30})
print(result)  # {'user': {'name': 'John', 'age': 30}}
```

#### Advanced Configuration

```python
import json_tools_rs as jt

# Advanced flattening with filtering and transformations
tools = (jt.JSONTools()
    .flatten()
    .separator("::")
    .lowercase_keys(True)
    .remove_empty_strings(True)
    .remove_nulls(True)
    .remove_empty_objects(True)
    .remove_empty_arrays(True)
    .key_replacement("(User|Admin)_", "")
    .value_replacement("@example.com", "@company.org"))

data = {"User_name": "John", "Admin_email": "john@example.com", "empty": "", "null_val": None}
result = tools.execute(data)
print(result)  # {'name': 'John', 'email': 'john@company.org'}

# Advanced unflattening with same configuration options
result = (jt.JSONTools()
    .unflatten()
    .separator("::")
    .lowercase_keys(True)
    .remove_empty_strings(True)
    .remove_nulls(True)
    .key_replacement("prefix_", "user_")
    .value_replacement("@company.org", "@example.com")
    .execute({"PREFIX_NAME": "john", "PREFIX_EMAIL": "john@company.org", "empty": ""}))
print(result)  # {'user': {'name': 'john', 'email': 'john@example.com'}}
```

#### Key Collision Handling

When transformations make different keys end up identical, enable collision handling to collect values into arrays.

```python
import json_tools_rs as jt

tools = (jt.JSONTools()
    .flatten()
    .key_replacement("(user|admin)_", "")  # both become "name"
    .handle_key_collision(True))                    # collect colliding values

data = {"user_name": "John", "admin_name": "Jane"}
print(tools.execute(data))  # {'name': ['John', 'Jane']}
```

#### Automatic Type Conversion

Convert string values to numbers and booleans automatically for data cleaning and normalization.

```python
import json_tools_rs as jt

# Type conversion with dict input
data = {
    "id": "123",
    "price": "$1,234.56",
    "quantity": "1,000",
    "active": "true",
    "verified": "FALSE",
    "name": "Product"
}

result = (jt.JSONTools()
    .flatten()
    .auto_convert_types(True)
    .execute(data))

print(result)
# Output: {
#   'id': 123,
#   'price': 1234.56,
#   'quantity': 1000,
#   'active': True,
#   'verified': False,
#   'name': 'Product'  # Keeps as string (not a valid number or boolean)
# }

# Works with JSON strings too
json_str = '{"id": "456", "enabled": "true", "amount": "€99.99"}'
result = jt.JSONTools().flatten().auto_convert_types(True).execute(json_str)
print(result)  # '{"id": 456, "enabled": true, "amount": 99.99}'
```

#### Batch Processing with Type Preservation

```python
import json_tools_rs as jt

tools = jt.JSONTools().flatten()

# List[str] input β†’ List[str] output
str_batch = ['{"a": {"b": 1}}', '{"c": {"d": 2}}']
results = tools.execute(str_batch)
print(results)  # ['{"a.b": 1}', '{"c.d": 2}']

# List[dict] input β†’ List[dict] output
dict_batch = [{"a": {"b": 1}}, {"c": {"d": 2}}]
results = tools.execute(dict_batch)
print(results)  # [{'a.b': 1}, {'c.d': 2}]

# Mixed types are handled automatically
mixed_batch = ['{"a": 1}', {"b": {"c": 2}}]
results = tools.execute(mixed_batch)
print(results)  # ['{"a": 1}', {'b.c': 2}]
```

#### Perfect Roundtrip Support

```python
import json_tools_rs

# Perfect roundtrip with Python dicts
original = {"user": {"name": "John", "age": 30}, "items": [1, 2, {"nested": "value"}]}

# Flatten
flattened = json_tools_rs.JSONTools().flatten().execute(original)
print(f"Flattened: {flattened}")

# Unflatten back to original structure
restored = json_tools_rs.JSONTools().unflatten().execute(flattened)
print(f"Restored: {restored}")

# Verify perfect roundtrip
assert original == restored  # Perfect roundtrip with dicts!
```

## Quick Reference

### Method Cheat Sheet

| Method | Description | Example |
|--------|-------------|---------|
| `.flatten()` | Set operation mode to flatten | `JSONTools::new().flatten()` |
| `.unflatten()` | Set operation mode to unflatten | `JSONTools::new().unflatten()` |
| `.separator(sep)` | Set key separator (default: `"."`) | `.separator("::")` |
| `.lowercase_keys(bool)` | Convert keys to lowercase | `.lowercase_keys(true)` |
| `.remove_empty_strings(bool)` | Remove empty string values | `.remove_empty_strings(true)` |
| `.remove_nulls(bool)` | Remove null values | `.remove_nulls(true)` |
| `.remove_empty_objects(bool)` | Remove empty objects `{}` | `.remove_empty_objects(true)` |
| `.remove_empty_arrays(bool)` | Remove empty arrays `[]` | `.remove_empty_arrays(true)` |
| `.key_replacement(find, replace)` | Replace key patterns (regex or literal) | `.key_replacement("user_", "")` |
| `.value_replacement(find, replace)` | Replace value patterns (regex or literal) | `.value_replacement("@old.com", "@new.com")` |
| `.handle_key_collision(bool)` | Collect colliding keys into arrays | `.handle_key_collision(true)` |
| `.execute(input)` | Execute the configured operation | `.execute(json_string)` |

### Common Patterns

**Flatten with filtering:**
```rust
JSONTools::new()
    .flatten()
    .remove_nulls(true)
    .remove_empty_strings(true)
    .execute(json)?
```

**Unflatten with custom separator:**
```rust
JSONTools::new()
    .unflatten()
    .separator("::")
    .execute(flattened_json)?
```

**Transform keys and values:**
```rust
JSONTools::new()
    .flatten()
    .lowercase_keys(true)
    .key_replacement("(user|admin)_", "")
    .value_replacement("@example.com", "@company.org")
    .execute(json)?
```

**Handle key collisions:**
```rust
JSONTools::new()
    .flatten()
    .key_replacement("prefix_", "")
    .handle_key_collision(true)  // Colliding values β†’ arrays
    .execute(json)?
```

## Installation

### Rust

Add to your `Cargo.toml`:

```toml
[dependencies]
json-tools-rs = "0.7.0"
```

Or install via cargo:

```bash
cargo add json-tools-rs
```

**Note**: Parallel processing is built-in and automatic - no feature flags needed!

### Python

#### From PyPI (Recommended)

```bash
pip install json-tools-rs
```

#### Build from Source with Maturin

If you want to build from source or contribute to development:

```bash
# Clone the repository
git clone https://github.com/amaye15/JSON-Tools-rs.git
cd JSON-Tools-rs

# Install maturin if you haven't already
pip install maturin

# Build and install the Python package
maturin develop --features python

# Or build a wheel for distribution
maturin build --features python --release
```

#### Development Setup

```bash
# For development with automatic rebuilds
maturin develop --features python

# Run Python examples
python python/examples/basic_usage.py
python python/examples/examples.py
```

## Performance

JSON Tools RS delivers exceptional performance through multiple carefully implemented optimizations:

### Performance Optimizations

1. **FxHashMap** - ~15-30% faster string key operations compared to standard HashMap
   - Optimized hash function for string keys
   - Reduced collision overhead

2. **SIMD JSON Parsing** - Hardware-accelerated parsing and serialization via simd-json
   - Leverages CPU SIMD instructions for parallel processing
   - Significantly faster than standard serde_json for large payloads

3. **Reduced Allocations** - Minimized memory allocations using Cow (Copy-on-Write) and scoped buffers
   - ~50% reduction in string clones during key transformations
   - Efficient memory reuse across operations

4. **Smart Capacity Management** - Pre-sized maps and string builders to minimize rehashing
   - Reduces reallocation overhead
   - Improves cache locality

5. **Parallel Batch Processing** (built-in, always enabled) - Rayon-based parallelism for batch operations
   - **3-5x speedup** for batches of 10+ items on multi-core CPUs
   - Adaptive threshold prevents overhead for small batches
   - Zero per-item memory overhead
   - Thread-safe regex cache with Arc<Regex> for O(1) cloning

### Parallel Processing

Parallel processing is **built-in and automatic** - no feature flags or special configuration needed!

JSON-Tools-rs provides **two levels of parallelism**:

#### 1. Batch-Level Parallelism (Across Multiple Documents)

Process multiple JSON documents in parallel automatically.

**Performance Gains:**
- Batch size 10: **2.5x faster**
- Batch size 50: **3.3x faster**
- Batch size 100: **3.3x faster**
- Batch size 500: **5.3x faster**
- Batch size 1000: **5.4x faster**

**Configuration (Optional):**

```rust
use json_tools_rs::JSONTools;

// Default threshold (10 items) - optimal for most use cases
// Parallelism activates automatically for batches β‰₯ 10 items
let result = JSONTools::new()
    .flatten()
    .execute(batch)?;

// Custom threshold for fine-tuning
let result = JSONTools::new()
    .flatten()
    .parallel_threshold(50)  // Only parallelize batches β‰₯ 50 items
    .execute(batch)?;

// Custom thread count
let result = JSONTools::new()
    .flatten()
    .num_threads(Some(4))  // Use exactly 4 threads
    .execute(batch)?;

// Environment variables (runtime configuration)
// JSON_TOOLS_PARALLEL_THRESHOLD=20 cargo run
// JSON_TOOLS_NUM_THREADS=4 cargo run
```

**How it works:**
- Batches below threshold (default: 10): Sequential processing (no overhead)
- Batches 10-1000: Rayon work-stealing parallelism
- Batches > 1000: Chunked processing for optimal cache locality
- Each worker thread gets its own regex cache
- Zero per-item memory increase (only 8-16MB one-time thread pool)
- Thread count defaults to number of logical CPUs (configurable via `num_threads()` or `JSON_TOOLS_NUM_THREADS`)

#### 2. Nested Parallelism (Within Large Documents)

For large individual JSON documents, nested parallelism automatically parallelizes the processing of large objects and arrays **within** a single document.

**Performance Gains:**
- Large documents (20,000+ items): **7-12% faster**
- Very large documents (100,000+ items): **7-12% faster**
- Small/medium documents: No overhead (stays sequential)

**Configuration (Optional):**

```rust
use json_tools_rs::JSONTools;

// Default threshold (100 items) - optimal for most use cases
// Objects/arrays with 100+ keys/items are processed in parallel
let result = JSONTools::new()
    .flatten()
    .execute(large_json)?;

// Custom threshold for very large documents
let result = JSONTools::new()
    .flatten()
    .nested_parallel_threshold(50)  // More aggressive parallelism
    .execute(large_json)?;

// Disable nested parallelism (for small/medium documents)
let result = JSONTools::new()
    .flatten()
    .nested_parallel_threshold(usize::MAX)  // Disable
    .execute(json)?;

// Environment variable (runtime configuration)
// JSON_TOOLS_NESTED_PARALLEL_THRESHOLD=200 cargo run
```

**How it works:**
- Objects/arrays below threshold (default: 100): Sequential processing
- Objects/arrays above threshold: Parallel processing using Rayon
- Each parallel branch gets its own string builder
- Results are merged efficiently with minimal overhead
- Rayon's work-stealing automatically balances load across CPU cores
- Minimal memory overhead (< 1 MB for very large documents)

**When to use:**
- βœ… Large JSON documents (20,000+ items)
- βœ… Very large JSON documents (100,000+ items)
- βœ… Wide, flat structures (many keys at same level)
- ❌ Small documents (< 5,000 items) - no benefit
- ❌ Deeply nested but narrow structures - marginal benefit

### Benchmark Results

Performance varies by workload complexity, but typical results on modern hardware include:

- **Basic flattening**: 2,000+ operations/ms
- **Advanced configuration**: 1,300+ operations/ms (with filtering and transformations)
- **Regex replacements**: 1,800+ operations/ms (with pattern matching)
- **Batch processing**: 1,900+ operations/ms (for multiple JSON documents)
- **Roundtrip operations**: 1,000+ flatten→unflatten cycles/ms

*Note: Benchmarks run on typical development hardware. Your results may vary based on CPU, memory, and workload characteristics.*

### Running Benchmarks

```bash
# Run comprehensive benchmarks
cargo bench

# Run specific benchmark suites
cargo bench flatten
cargo bench unflatten
cargo bench roundtrip

# Generate HTML reports (available in target/criterion)
cargo bench --features html_reports
```

## API Reference

### JSONTools - Unified API

The `JSONTools` struct is the single entry point for all JSON manipulation operations. It provides a builder pattern API that works for both flattening and unflattening operations.

#### Core Methods

- **`JSONTools::new()`** - Create a new instance with default settings
- **`.flatten()`** - Configure for flattening operations (converts nested JSON to flat key-value pairs)
- **`.unflatten()`** - Configure for unflattening operations (converts flat key-value pairs back to nested JSON)
- **`.normal()`** - Configure for pass-through operations (apply transformations without flattening/unflattening)
- **`.execute(input)`** - Execute the configured operation on the provided input

#### Configuration Methods

All configuration methods are chainable and available for both flattening and unflattening operations:

##### Key/Value Transformation Methods

- **`.separator(sep: &str)`** - Set separator for nested keys (default: `"."`)
  - Example: `separator("::")` makes keys like `user::name::first`

- **`.lowercase_keys(value: bool)`** - Convert all keys to lowercase
  - Example: `UserName` becomes `username`

- **`.key_replacement(find: &str, replace: &str)`** - Add key replacement pattern
  - Supports standard Rust regex syntax (automatically detected)
  - Falls back to literal string replacement if regex compilation fails
  - Example: `key_replacement("(user|admin)_", "")` removes prefixes

- **`.value_replacement(find: &str, replace: &str)`** - Add value replacement pattern
  - Supports standard Rust regex syntax (automatically detected)
  - Falls back to literal string replacement if regex compilation fails
  - Example: `value_replacement("@example.com", "@company.org")` updates email domains

##### Filtering Methods

All filtering methods work for both flatten and unflatten operations:

- **`.remove_empty_strings(value: bool)`** - Remove keys with empty string values (`""`)
- **`.remove_nulls(value: bool)`** - Remove keys with null values
- **`.remove_empty_objects(value: bool)`** - Remove keys with empty object values (`{}`)
- **`.remove_empty_arrays(value: bool)`** - Remove keys with empty array values (`[]`)

##### Collision Handling Methods

- **`.handle_key_collision(value: bool)`** - When enabled, collects values with identical keys into arrays
  - Useful when transformations cause different keys to become identical
  - Example: After removing prefixes, `user_name` and `admin_name` both become `name`
  - With collision handling: `{"name": ["John", "Jane"]}`
  - Without collision handling: Last value wins

##### Type Conversion Methods

- **`.auto_convert_types(enable: bool)`** - Automatically convert string values to numbers and booleans
  - **Number conversion**: Handles various formats including:
    - Basic numbers: `"123"` β†’ `123`, `"45.67"` β†’ `45.67`, `"-10"` β†’ `-10`
    - Thousands separators: `"1,234.56"` β†’ `1234.56` (US), `"1.234,56"` β†’ `1234.56` (EU)
    - Currency symbols: `"$123.45"` β†’ `123.45`, `"€99.99"` β†’ `99.99`
    - Scientific notation: `"1e5"` β†’ `100000`, `"1.23e-4"` β†’ `0.000123`
  - **Boolean conversion**: Only these exact variants:
    - `"true"`, `"TRUE"`, `"True"` β†’ `true`
    - `"false"`, `"FALSE"`, `"False"` β†’ `false`
  - **Lenient behavior**: If conversion fails, keeps the original string value (no errors thrown)
  - **Works for all modes**: `.flatten()`, `.unflatten()`, and `.normal()`
  - **Example**:
    ```rust
    let json = r#"{"id": "123", "price": "$1,234.56", "active": "true"}"#;
    let result = JSONTools::new()
        .flatten()
        .auto_convert_types(true)
        .execute(json)?;
    // Result: {"id": 123, "price": 1234.56, "active": true}
    ```

#### Input/Output Types

**Rust:**
- `&str` (JSON string) β†’ `JsonOutput::Single(String)`
- `Vec<&str>` or `Vec<String>` β†’ `JsonOutput::Multiple(Vec<String>)`

**Python (Perfect Type Preservation):**
- `str` β†’ `str` (JSON string input β†’ JSON string output)
- `dict` β†’ `dict` (Python dict input β†’ Python dict output)
- `List[str]` β†’ `List[str]` (list of JSON strings β†’ list of JSON strings)
- `List[dict]` β†’ `List[dict]` (list of Python dicts β†’ list of Python dicts)
- Mixed lists preserve original element types

### Error Handling

The library uses a comprehensive `JsonToolsError` enum that provides detailed error information and actionable suggestions for debugging:

#### Error Variants

- **`JsonParseError`** - JSON parsing failures with syntax suggestions
  - Triggered by: Invalid JSON syntax, malformed input
  - Suggestion: Verify JSON syntax, check for missing quotes, trailing commas, unescaped characters

- **`RegexError`** - Regex pattern compilation errors with pattern suggestions
  - Triggered by: Invalid regex patterns in `key_replacement()` or `value_replacement()`
  - Suggestion: Verify regex syntax using standard Rust regex patterns

- **`InvalidJsonStructure`** - Structure validation errors with format guidance
  - Triggered by: Incompatible JSON structure for the requested operation
  - Suggestion: Ensure input matches expected format (nested for flatten, flat for unflatten)

- **`ConfigurationError`** - API usage errors with correct usage examples
  - Triggered by: Calling `.execute()` without setting operation mode
  - Suggestion: Call `.flatten()` or `.unflatten()` before `.execute()`

- **`BatchProcessingError`** - Batch operation errors with item-specific details
  - Triggered by: Invalid item in batch processing
  - Includes: Index of failing item for easy debugging
  - Suggestion: Check the JSON at the specified index

- **`InputValidationError`** - Input validation errors with helpful guidance
  - Triggered by: Invalid input type or empty input
  - Suggestion: Ensure input is valid JSON string, dict, or list

- **`SerializationError`** - JSON serialization failures with debugging information
  - Triggered by: Internal serialization errors (rare)
  - Suggestion: Report as potential bug

#### Error Handling Examples

**Rust:**
```rust
use json_tools_rs::{JSONTools, JsonToolsError};

match JSONTools::new().flatten().execute(invalid_json) {
    Ok(result) => println!("Success: {:?}", result),
    Err(JsonToolsError::JsonParseError { message, suggestion, .. }) => {
        eprintln!("Parse error: {}", message);
        eprintln!("πŸ’‘ {}", suggestion);
    }
    Err(e) => eprintln!("Error: {}", e),
}
```

**Python:**
```python
import json_tools_rs

try:
    result = json_tools_rs.JSONTools().flatten().execute(invalid_json)
except json_tools_rs.JsonToolsError as e:
    print(f"Error: {e}")
    # Error messages include helpful suggestions
```

## Common Use Cases

### 1. Data Pipeline Transformations

Flatten nested API responses for easier processing in data pipelines:

```rust
use json_tools_rs::{JSONTools, JsonOutput};

let api_response = r#"{
    "user": {
        "id": 123,
        "profile": {"name": "John", "email": "john@example.com"},
        "settings": {"theme": "dark", "notifications": true}
    }
}"#;

let flattened = JSONTools::new()
    .flatten()
    .execute(api_response)?;
// Result: {"user.id": 123, "user.profile.name": "John", ...}
// Perfect for CSV export, database insertion, or analytics
```

### 2. Data Cleaning and Normalization

Remove empty values and normalize keys for consistent data processing:

```python
import json_tools_rs as jt

# Clean messy data from external sources
messy_data = {
    "UserName": "Alice",
    "Email": "",           # Empty string
    "Age": None,           # Null value
    "Preferences": {},     # Empty object
    "Tags": []             # Empty array
}

cleaned = (jt.JSONTools()
    .flatten()
    .lowercase_keys(True)
    .remove_empty_strings(True)
    .remove_nulls(True)
    .remove_empty_objects(True)
    .remove_empty_arrays(True)
    .execute(messy_data))

# Result: {'username': 'Alice'}
# All empty/null values removed, keys normalized
```

### 3. Configuration File Processing

Transform between flat and nested configuration formats:

```rust
use json_tools_rs::{JSONTools, JsonOutput};

// Convert flat environment-style config to nested structure
let flat_config = r#"{
    "database.host": "localhost",
    "database.port": 5432,
    "database.name": "myapp",
    "cache.enabled": true,
    "cache.ttl": 3600,
    "cache.redis.host": "redis.local"
}"#;

let nested = JSONTools::new()
    .unflatten()
    .execute(flat_config)?;
// Result: {
//   "database": {"host": "localhost", "port": 5432, "name": "myapp"},
//   "cache": {"enabled": true, "ttl": 3600, "redis": {"host": "redis.local"}}
// }
```

### 4. Batch Data Processing

Process multiple JSON documents efficiently with type preservation:

```python
import json_tools_rs as jt

# Process batch of API responses
responses = [
    {"user": {"id": 1, "name": "Alice", "email": "alice@example.com"}},
    {"user": {"id": 2, "name": "Bob", "email": "bob@example.com"}},
    {"user": {"id": 3, "name": "Charlie", "email": "charlie@example.com"}}
]

# Flatten all responses in one call
flattened_batch = jt.JSONTools().flatten().execute(responses)
# Result: [
#   {'user.id': 1, 'user.name': 'Alice', 'user.email': 'alice@example.com'},
#   {'user.id': 2, 'user.name': 'Bob', 'user.email': 'bob@example.com'},
#   {'user.id': 3, 'user.name': 'Charlie', 'user.email': 'charlie@example.com'}
# ]
```

### 5. Multi-Source Data Aggregation

Aggregate data from multiple sources with key collision handling:

```python
import json_tools_rs as jt

# Data from different sources with overlapping keys
user_data = {"name": "John", "source": "database"}
admin_data = {"name": "Jane", "source": "ldap"}
guest_data = {"name": "Guest", "source": "default"}

# Combine with collision handling
combined = jt.JSONTools().flatten().handle_key_collision(True).execute([
    user_data, admin_data, guest_data
])

# With collision handling, duplicate keys become arrays
# Result: [
#   {'name': 'John', 'source': 'database'},
#   {'name': 'Jane', 'source': 'ldap'},
#   {'name': 'Guest', 'source': 'default'}
# ]
```

### 6. ETL Pipeline: Extract, Transform, Load

Complete ETL workflow with data transformation:

```rust
use json_tools_rs::{JSONTools, JsonOutput};

// Extract: Raw data from source
let raw_data = r#"{
    "USER_ID": 12345,
    "USER_PROFILE": {
        "FIRST_NAME": "John",
        "LAST_NAME": "Doe",
        "EMAIL_ADDRESS": "john.doe@oldcompany.com",
        "METADATA": {"created": "", "updated": null}
    }
}"#;

// Transform: Clean and normalize
let transformed = JSONTools::new()
    .flatten()
    .lowercase_keys(true)                              // Normalize keys
    .key_replacement("user_profile.", "")              // Remove prefix
    .value_replacement("@oldcompany.com", "@newcompany.com")  // Update domain
    .remove_empty_strings(true)                        // Clean empty values
    .remove_nulls(true)                                // Remove nulls
    .execute(raw_data)?;

// Load: Result ready for database insertion
// Result: {
//   "user_id": 12345,
//   "first_name": "John",
//   "last_name": "Doe",
//   "email_address": "john.doe@newcompany.com"
// }
```

## Examples and Testing

### Running Examples

**Rust Examples:**
```bash
# Basic usage examples
cargo run --example basic_usage

# View all available examples
ls examples/
```

**Python Examples:**
```bash
# Basic usage with type preservation
python python/examples/basic_usage.py

# Advanced features and collision handling
python python/examples/examples.py
```

### Running Tests

**Rust Tests:**
```bash
# Run all Rust tests
cargo test

# Run tests with verbose output
cargo test -- --nocapture

# Run tests with Python features enabled
cargo test --features python

# Run specific test module
cargo test test_module_name
```

**Python Tests:**
```bash
# Install test dependencies
pip install pytest

# Build the Python package first
maturin develop --features python

# Run all Python tests
python -m pytest python/tests/

# Run with verbose output
python -m pytest python/tests/ -v

# Run specific test file
python -m pytest python/tests/tests.py::TestClassName
```

## Limitations and Known Issues

### Current Limitations

1. **Array Index Notation**: Arrays are flattened using numeric indices (e.g., `array.0`, `array.1`). Custom array handling is not currently supported.

2. **Separator Constraints**: The separator cannot contain characters that are valid in JSON keys without escaping. Choose separators carefully to avoid conflicts.

3. **Regex Syntax**: Only standard Rust regex syntax is supported. Some advanced regex features may not be available.

4. **Memory Usage**: For very large JSON documents (>100MB), consider processing in smaller batches to optimize memory usage.

### Workarounds

**For custom array handling:**
```rust
// Pre-process arrays before flattening if custom handling is needed
// Or post-process the flattened result to transform array indices
```

**For separator conflicts:**
```rust
// Use a separator that won't appear in your keys
JSONTools::new().flatten().separator("::").execute(json)?
```

### Reporting Issues

If you encounter a bug or have a feature request, please [open an issue](https://github.com/amaye15/JSON-Tools-rs/issues) on GitHub with:
- A minimal reproducible example
- Expected vs. actual behavior
- Your environment (Rust version, OS, etc.)

## Frequently Asked Questions (FAQ)

### General Questions

**Q: What's the difference between `.flatten()` and `.unflatten()`?**

A: `.flatten()` converts nested JSON structures into flat key-value pairs with dot-separated keys. `.unflatten()` does the reverse, converting flat key-value pairs back into nested structures.

```rust
// Flatten: {"user": {"name": "John"}} β†’ {"user.name": "John"}
// Unflatten: {"user.name": "John"} β†’ {"user": {"name": "John"}}
```

**Q: Can I use the same configuration methods for both flatten and unflatten?**

A: Yes! All configuration methods (filtering, transformations, etc.) work for both operations. The library applies them intelligently based on the operation mode.

**Q: What happens if I don't call `.flatten()` or `.unflatten()` before `.execute()`?**

A: You'll get a `ConfigurationError` with a helpful message telling you to set the operation mode first.

### Python-Specific Questions

**Q: What input types does the Python API support?**

A: The Python API supports:
- `str` (JSON strings)
- `dict` (Python dictionaries)
- `List[str]` (lists of JSON strings)
- `List[dict]` (lists of Python dictionaries)
- Mixed lists (preserves original types)

**Q: Does the output type always match the input type?**

A: Yes! This is a key feature. `str` input β†’ `str` output, `dict` input β†’ `dict` output, etc. This makes the API predictable and easy to use.

### Performance Questions

**Q: How does performance compare to other JSON libraries?**

A: JSON Tools RS is optimized for high performance with SIMD-accelerated parsing, FxHashMap, and reduced allocations. Benchmarks show 2,000+ operations/ms for basic flattening. See the [Performance](#performance) section for details.

**Q: Is it safe to use in production?**

A: Yes! The library includes comprehensive error handling, extensive test coverage, and has been optimized for both correctness and performance.

### Feature Questions

**Q: How do I handle key collisions?**

A: Use `.handle_key_collision(true)` to collect colliding values into arrays. For example, if transformations cause `user_name` and `admin_name` to both become `name`, the result will be `{"name": ["John", "Jane"]}`.

**Q: Can I use regex patterns in replacements?**

A: Yes! Both `.key_replacement()` and `.value_replacement()` support standard Rust regex syntax. The library automatically detects regex patterns and falls back to literal replacement if the pattern is invalid.

**Q: What filtering options are available?**

A: You can remove:
- Empty strings: `.remove_empty_strings(true)`
- Null values: `.remove_nulls(true)`
- Empty objects: `.remove_empty_objects(true)`
- Empty arrays: `.remove_empty_arrays(true)`

All filtering methods work for both flatten and unflatten operations.

**Q: Can I process multiple JSON documents at once?**

A: Yes! Pass a `Vec<String>` in Rust or a `List[str]` or `List[dict]` in Python. The library will process them efficiently in batch mode.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

### Development Setup

1. **Clone the repository**
   ```bash
   git clone https://github.com/amaye15/JSON-Tools-rs.git
   cd JSON-Tools-rs
   ```

2. **Install Rust** (latest stable)
   ```bash
   curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
   ```

3. **Install Python 3.8+** and maturin for Python bindings
   ```bash
   pip install maturin pytest
   ```

4. **Run tests** to ensure everything works
   ```bash
   # Rust tests
   cargo test

   # Python tests
   maturin develop --features python
   python -m pytest python/tests/
   ```

5. **Run benchmarks** to verify performance
   ```bash
   cargo bench
   ```

### Contribution Guidelines

- Write tests for new features
- Update documentation for API changes
- Run `cargo fmt` and `cargo clippy` before submitting
- Ensure all tests pass before creating a PR
- Add examples for significant new features

## License

This project is licensed under either of

- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)

at your option.

## Changelog

### v0.4.0 (Current)
- Comprehensive README documentation update
- Enhanced API reference with detailed method descriptions
- Improved error handling documentation with examples
- Updated installation instructions
- Added contribution guidelines
- Performance optimization details and benchmarking guide

### v0.3.0
- Performance optimizations (FxHashMap, SIMD parsing, reduced allocations)
- Enhanced error messages with actionable suggestions
- Improved Python bindings stability
- Bug fixes and code quality improvements

### v0.2.0
- Updated README with comprehensive documentation
- Improved API documentation and examples
- Enhanced Python bindings documentation
- Performance optimization details
- Complete error handling documentation

### v0.1.0
- Initial release with unified JSONTools API
- Complete flattening and unflattening support
- Advanced filtering and transformation capabilities
- Key collision handling with `.handle_key_collision()`
- Python bindings with perfect type matching
- Comprehensive error handling with detailed suggestions


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "json-tools-rs",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "json, flatten, manipulation, parsing, rust, simd, performance",
    "author": "JSON Tools RS Contributors",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/06/25/241a9244a9a9cf7ca581d7e693f2b128c60a68c2c67757c079ecee134dc7/json_tools_rs-0.7.0.tar.gz",
    "platform": null,
    "description": "# JSON Tools RS\n\nA high-performance Rust library for advanced JSON manipulation with SIMD-accelerated parsing, providing unified flattening and unflattening operations through a clean builder pattern API.\n\n[![Crates.io](https://img.shields.io/crates/v/json-tools-rs.svg)](https://crates.io/crates/json-tools-rs)\n[![Documentation](https://docs.rs/json-tools-rs/badge.svg)](https://docs.rs/json-tools-rs)\n[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](LICENSE-MIT)\n\n## Why JSON Tools RS?\n\nJSON Tools RS is designed for developers who need to:\n- **Transform nested JSON** into flat structures for databases, CSV exports, or analytics\n- **Clean and normalize** JSON data from external APIs or user input\n- **Process large batches** of JSON documents efficiently\n- **Maintain type safety** with perfect roundtrip support (flatten \u2192 unflatten \u2192 original)\n- **Work with both Rust and Python** using the same consistent API\n\nUnlike simple JSON parsers, JSON Tools RS provides a complete toolkit for JSON transformation with production-ready performance and error handling.\n\n## Features\n\n- \ud83d\ude80 **Unified API**: Single `JSONTools` entry point for flattening, unflattening, or pass-through transforms (`.normal()`)\n- \ud83d\udd27 **Builder Pattern**: Fluent, chainable API for easy configuration and method chaining\n- \u26a1 **High Performance**: SIMD-accelerated JSON parsing with FxHashMap and optimized memory allocations\n- \ud83d\ude84 **Parallel Processing**: Built-in Rayon-based parallelism for 3-5x speedup on batch operations (automatic, no configuration needed)\n- \ud83c\udfaf **Complete Roundtrip**: Flatten JSON and unflatten back to original structure with perfect fidelity\n- \ud83e\uddf9 **Comprehensive Filtering**: Remove empty strings, nulls, empty objects, and empty arrays (works for both flatten and unflatten)\n- \ud83d\udd04 **Advanced Replacements**: Literal and regex-based key/value replacements using standard Rust regex syntax\n- \ud83d\udee1\ufe0f **Collision Handling**: Intelligent `.handle_key_collision(true)` to collect colliding values into arrays\n- \ud83d\udd00 **Automatic Type Conversion**: Convert strings to numbers and booleans with `.auto_convert_types(true)` - handles currency, thousands separators, scientific notation\n- \ud83d\udce6 **Batch Processing**: Process single JSON or batches; Python also supports dicts and lists of dicts\n- \ud83d\udc0d **Python Bindings**: Full Python support with perfect type preservation (input type = output type)\n- \ud83e\uddf0 **Robust Errors**: Comprehensive `JsonToolsError` enum with helpful suggestions for debugging\n- \ud83d\udd25 **Performance Optimizations**: FxHashMap (~15-30% faster), SIMD parsing, Cow-based string handling, and automatic parallel processing\n\n## Table of Contents\n\n- [Why JSON Tools RS?](#why-json-tools-rs)\n- [Features](#features)\n- [Quick Start](#quick-start)\n  - [Rust Examples](#rust---unified-jsontools-api)\n  - [Python Examples](#python---unified-jsontools-api)\n- [Quick Reference](#quick-reference)\n- [Installation](#installation)\n- [Performance](#performance)\n- [API Reference](#api-reference)\n  - [Core Methods](#core-methods)\n  - [Configuration Methods](#configuration-methods)\n  - [Input/Output Types](#inputoutput-types)\n- [Error Handling](#error-handling)\n- [Common Use Cases](#common-use-cases)\n- [Examples and Testing](#examples-and-testing)\n- [Limitations and Known Issues](#limitations-and-known-issues)\n- [FAQ](#frequently-asked-questions-faq)\n- [Contributing](#contributing)\n- [License](#license)\n- [Changelog](#changelog)\n\n## Quick Start\n\n### Rust - Unified JSONTools API\n\nThe `JSONTools` struct provides a unified builder pattern API for all JSON manipulation operations. Simply call `.flatten()` or `.unflatten()` to set the operation mode, then chain configuration methods and call `.execute()`.\n\n#### Basic Flattening\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet json = r#\"{\"user\": {\"name\": \"John\", \"profile\": {\"age\": 30, \"city\": \"NYC\"}}}\"#;\nlet result = JSONTools::new()\n    .flatten()\n    .execute(json)?;\n\nif let JsonOutput::Single(flattened) = result {\n    println!(\"{}\", flattened);\n}\n// Output: {\"user.name\": \"John\", \"user.profile.age\": 30, \"user.profile.city\": \"NYC\"}\n```\n\n#### Advanced Flattening with Filtering\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet json = r#\"{\"user\": {\"name\": \"John\", \"details\": {\"age\": null, \"city\": \"\"}}}\"#;\nlet result = JSONTools::new()\n    .flatten()\n    .separator(\"::\")\n    .lowercase_keys(true)\n    .key_replacement(\"(User|Admin)_\", \"\")\n    .value_replacement(\"@example.com\", \"@company.org\")\n    .remove_empty_strings(true)\n    .remove_nulls(true)\n    .remove_empty_objects(true)\n    .remove_empty_arrays(true)\n    .execute(json)?;\n\nif let JsonOutput::Single(flattened) = result {\n    println!(\"{}\", flattened);\n}\n// Output: {\"user::name\": \"John\"}\n```\n\n#### Basic Unflattening\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet flattened = r#\"{\"user.name\": \"John\", \"user.profile.age\": 30}\"#;\nlet result = JSONTools::new()\n    .unflatten()\n    .execute(flattened)?;\n\nmatch result {\n    JsonOutput::Single(unflattened) => println!(\"{}\", unflattened),\n    JsonOutput::Multiple(_) => unreachable!(),\n}\n// Output: {\"user\": {\"name\": \"John\", \"profile\": {\"age\": 30}}}\n```\n\n#### Advanced Unflattening with Configuration\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet flattened = r#\"{\"user::name\": \"John\", \"user::age\": 30, \"user::email\": \"\"}\"#;\nlet result = JSONTools::new()\n    .unflatten()\n    .separator(\"::\")\n    .lowercase_keys(true)\n    .remove_empty_strings(true)\n    .remove_nulls(true)\n    .execute(flattened)?;\n\nmatch result {\n    JsonOutput::Single(unflattened) => println!(\"{}\", unflattened),\n    JsonOutput::Multiple(_) => unreachable!(),\n}\n// Output: {\"user\": {\"name\": \"John\", \"age\": 30}}\n```\n\n#### Key Collision Handling\n\nWhen transformations make different keys end up identical, enable collision handling to collect values into arrays.\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet json = r#\"{\"user_name\": \"John\", \"admin_name\": \"Jane\"}\"#;\nlet result = JSONTools::new()\n    .flatten()\n    .key_replacement(\"(user|admin)_\", \"\") // both become \"name\"\n    .handle_key_collision(true)                    // collect colliding values\n    .execute(json)?;\n\nif let JsonOutput::Single(flattened) = result {\n    println!(\"{}\", flattened);\n}\n// Output: {\"name\": [\"John\", \"Jane\"]}\n```\n\n#### Automatic Type Conversion\n\nConvert string values to numbers and booleans automatically for data cleaning and normalization.\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet json = r#\"{\n    \"id\": \"123\",\n    \"price\": \"$1,234.56\",\n    \"quantity\": \"1,000\",\n    \"active\": \"true\",\n    \"verified\": \"FALSE\",\n    \"name\": \"Product\"\n}\"#;\n\nlet result = JSONTools::new()\n    .flatten()\n    .auto_convert_types(true)\n    .execute(json)?;\n\nif let JsonOutput::Single(flattened) = result {\n    println!(\"{}\", flattened);\n}\n// Output: {\n//   \"id\": 123,\n//   \"price\": 1234.56,\n//   \"quantity\": 1000,\n//   \"active\": true,\n//   \"verified\": false,\n//   \"name\": \"Product\"  // Keeps as string (not a valid number or boolean)\n// }\n```\n\n#### Perfect Roundtrip Support\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet original = r#\"{\"user\": {\"name\": \"John\", \"age\": 30}, \"items\": [1, 2, {\"nested\": \"value\"}]}\"#;\n\n// Flatten\nlet flattened = JSONTools::new().flatten().execute(original)?;\nlet flattened_str = match flattened { JsonOutput::Single(s) => s, _ => unreachable!() };\n\n// Unflatten back to original structure\nlet restored = JSONTools::new().unflatten().execute(&flattened_str)?;\nlet restored_str = match restored { JsonOutput::Single(s) => s, _ => unreachable!() };\n\n// Verify perfect roundtrip\nassert_eq!(\n    serde_json::from_str::<serde_json::Value>(original)?,\n    serde_json::from_str::<serde_json::Value>(&restored_str)?\n);\n```\n\n\n### Python - Unified JSONTools API\n\nThe Python bindings provide the same unified `JSONTools` API with **perfect type matching**: input type equals output type. This makes the API predictable and easy to use.\n\n#### Type Preservation Examples\n\n```python\nimport json_tools_rs as jt\n\n# Example 1: dict input \u2192 dict output\nresult = jt.JSONTools().flatten().execute({\"user\": {\"name\": \"John\", \"age\": 30}})\nprint(result)  # {'user.name': 'John', 'user.age': 30}\nprint(type(result))  # <class 'dict'>\n\n# Example 2: JSON string input \u2192 JSON string output\nresult = jt.JSONTools().flatten().execute('{\"user\": {\"name\": \"John\", \"age\": 30}}')\nprint(result)  # '{\"user.name\": \"John\", \"user.age\": 30}'\nprint(type(result))  # <class 'str'>\n\n# Example 3: List[dict] input \u2192 List[dict] output\nbatch = [{\"a\": {\"b\": 1}}, {\"c\": {\"d\": 2}}]\nresult = jt.JSONTools().flatten().execute(batch)\nprint(result)  # [{'a.b': 1}, {'c.d': 2}]\nprint(type(result[0]))  # <class 'dict'>\n\n# Example 4: List[str] input \u2192 List[str] output\nbatch = ['{\"a\": {\"b\": 1}}', '{\"c\": {\"d\": 2}}']\nresult = jt.JSONTools().flatten().execute(batch)\nprint(result)  # ['{\"a.b\": 1}', '{\"c.d\": 2}']\nprint(type(result[0]))  # <class 'str'>\n```\n\n#### Basic Usage\n\n```python\nimport json_tools_rs as jt\n\n# Basic flattening - dict input \u2192 dict output\nresult = jt.JSONTools().flatten().execute({\"user\": {\"name\": \"John\", \"age\": 30}})\nprint(result)  # {'user.name': 'John', 'user.age': 30}\n\n# Basic unflattening - dict input \u2192 dict output\nresult = jt.JSONTools().unflatten().execute({\"user.name\": \"John\", \"user.age\": 30})\nprint(result)  # {'user': {'name': 'John', 'age': 30}}\n```\n\n#### Advanced Configuration\n\n```python\nimport json_tools_rs as jt\n\n# Advanced flattening with filtering and transformations\ntools = (jt.JSONTools()\n    .flatten()\n    .separator(\"::\")\n    .lowercase_keys(True)\n    .remove_empty_strings(True)\n    .remove_nulls(True)\n    .remove_empty_objects(True)\n    .remove_empty_arrays(True)\n    .key_replacement(\"(User|Admin)_\", \"\")\n    .value_replacement(\"@example.com\", \"@company.org\"))\n\ndata = {\"User_name\": \"John\", \"Admin_email\": \"john@example.com\", \"empty\": \"\", \"null_val\": None}\nresult = tools.execute(data)\nprint(result)  # {'name': 'John', 'email': 'john@company.org'}\n\n# Advanced unflattening with same configuration options\nresult = (jt.JSONTools()\n    .unflatten()\n    .separator(\"::\")\n    .lowercase_keys(True)\n    .remove_empty_strings(True)\n    .remove_nulls(True)\n    .key_replacement(\"prefix_\", \"user_\")\n    .value_replacement(\"@company.org\", \"@example.com\")\n    .execute({\"PREFIX_NAME\": \"john\", \"PREFIX_EMAIL\": \"john@company.org\", \"empty\": \"\"}))\nprint(result)  # {'user': {'name': 'john', 'email': 'john@example.com'}}\n```\n\n#### Key Collision Handling\n\nWhen transformations make different keys end up identical, enable collision handling to collect values into arrays.\n\n```python\nimport json_tools_rs as jt\n\ntools = (jt.JSONTools()\n    .flatten()\n    .key_replacement(\"(user|admin)_\", \"\")  # both become \"name\"\n    .handle_key_collision(True))                    # collect colliding values\n\ndata = {\"user_name\": \"John\", \"admin_name\": \"Jane\"}\nprint(tools.execute(data))  # {'name': ['John', 'Jane']}\n```\n\n#### Automatic Type Conversion\n\nConvert string values to numbers and booleans automatically for data cleaning and normalization.\n\n```python\nimport json_tools_rs as jt\n\n# Type conversion with dict input\ndata = {\n    \"id\": \"123\",\n    \"price\": \"$1,234.56\",\n    \"quantity\": \"1,000\",\n    \"active\": \"true\",\n    \"verified\": \"FALSE\",\n    \"name\": \"Product\"\n}\n\nresult = (jt.JSONTools()\n    .flatten()\n    .auto_convert_types(True)\n    .execute(data))\n\nprint(result)\n# Output: {\n#   'id': 123,\n#   'price': 1234.56,\n#   'quantity': 1000,\n#   'active': True,\n#   'verified': False,\n#   'name': 'Product'  # Keeps as string (not a valid number or boolean)\n# }\n\n# Works with JSON strings too\njson_str = '{\"id\": \"456\", \"enabled\": \"true\", \"amount\": \"\u20ac99.99\"}'\nresult = jt.JSONTools().flatten().auto_convert_types(True).execute(json_str)\nprint(result)  # '{\"id\": 456, \"enabled\": true, \"amount\": 99.99}'\n```\n\n#### Batch Processing with Type Preservation\n\n```python\nimport json_tools_rs as jt\n\ntools = jt.JSONTools().flatten()\n\n# List[str] input \u2192 List[str] output\nstr_batch = ['{\"a\": {\"b\": 1}}', '{\"c\": {\"d\": 2}}']\nresults = tools.execute(str_batch)\nprint(results)  # ['{\"a.b\": 1}', '{\"c.d\": 2}']\n\n# List[dict] input \u2192 List[dict] output\ndict_batch = [{\"a\": {\"b\": 1}}, {\"c\": {\"d\": 2}}]\nresults = tools.execute(dict_batch)\nprint(results)  # [{'a.b': 1}, {'c.d': 2}]\n\n# Mixed types are handled automatically\nmixed_batch = ['{\"a\": 1}', {\"b\": {\"c\": 2}}]\nresults = tools.execute(mixed_batch)\nprint(results)  # ['{\"a\": 1}', {'b.c': 2}]\n```\n\n#### Perfect Roundtrip Support\n\n```python\nimport json_tools_rs\n\n# Perfect roundtrip with Python dicts\noriginal = {\"user\": {\"name\": \"John\", \"age\": 30}, \"items\": [1, 2, {\"nested\": \"value\"}]}\n\n# Flatten\nflattened = json_tools_rs.JSONTools().flatten().execute(original)\nprint(f\"Flattened: {flattened}\")\n\n# Unflatten back to original structure\nrestored = json_tools_rs.JSONTools().unflatten().execute(flattened)\nprint(f\"Restored: {restored}\")\n\n# Verify perfect roundtrip\nassert original == restored  # Perfect roundtrip with dicts!\n```\n\n## Quick Reference\n\n### Method Cheat Sheet\n\n| Method | Description | Example |\n|--------|-------------|---------|\n| `.flatten()` | Set operation mode to flatten | `JSONTools::new().flatten()` |\n| `.unflatten()` | Set operation mode to unflatten | `JSONTools::new().unflatten()` |\n| `.separator(sep)` | Set key separator (default: `\".\"`) | `.separator(\"::\")` |\n| `.lowercase_keys(bool)` | Convert keys to lowercase | `.lowercase_keys(true)` |\n| `.remove_empty_strings(bool)` | Remove empty string values | `.remove_empty_strings(true)` |\n| `.remove_nulls(bool)` | Remove null values | `.remove_nulls(true)` |\n| `.remove_empty_objects(bool)` | Remove empty objects `{}` | `.remove_empty_objects(true)` |\n| `.remove_empty_arrays(bool)` | Remove empty arrays `[]` | `.remove_empty_arrays(true)` |\n| `.key_replacement(find, replace)` | Replace key patterns (regex or literal) | `.key_replacement(\"user_\", \"\")` |\n| `.value_replacement(find, replace)` | Replace value patterns (regex or literal) | `.value_replacement(\"@old.com\", \"@new.com\")` |\n| `.handle_key_collision(bool)` | Collect colliding keys into arrays | `.handle_key_collision(true)` |\n| `.execute(input)` | Execute the configured operation | `.execute(json_string)` |\n\n### Common Patterns\n\n**Flatten with filtering:**\n```rust\nJSONTools::new()\n    .flatten()\n    .remove_nulls(true)\n    .remove_empty_strings(true)\n    .execute(json)?\n```\n\n**Unflatten with custom separator:**\n```rust\nJSONTools::new()\n    .unflatten()\n    .separator(\"::\")\n    .execute(flattened_json)?\n```\n\n**Transform keys and values:**\n```rust\nJSONTools::new()\n    .flatten()\n    .lowercase_keys(true)\n    .key_replacement(\"(user|admin)_\", \"\")\n    .value_replacement(\"@example.com\", \"@company.org\")\n    .execute(json)?\n```\n\n**Handle key collisions:**\n```rust\nJSONTools::new()\n    .flatten()\n    .key_replacement(\"prefix_\", \"\")\n    .handle_key_collision(true)  // Colliding values \u2192 arrays\n    .execute(json)?\n```\n\n## Installation\n\n### Rust\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\njson-tools-rs = \"0.7.0\"\n```\n\nOr install via cargo:\n\n```bash\ncargo add json-tools-rs\n```\n\n**Note**: Parallel processing is built-in and automatic - no feature flags needed!\n\n### Python\n\n#### From PyPI (Recommended)\n\n```bash\npip install json-tools-rs\n```\n\n#### Build from Source with Maturin\n\nIf you want to build from source or contribute to development:\n\n```bash\n# Clone the repository\ngit clone https://github.com/amaye15/JSON-Tools-rs.git\ncd JSON-Tools-rs\n\n# Install maturin if you haven't already\npip install maturin\n\n# Build and install the Python package\nmaturin develop --features python\n\n# Or build a wheel for distribution\nmaturin build --features python --release\n```\n\n#### Development Setup\n\n```bash\n# For development with automatic rebuilds\nmaturin develop --features python\n\n# Run Python examples\npython python/examples/basic_usage.py\npython python/examples/examples.py\n```\n\n## Performance\n\nJSON Tools RS delivers exceptional performance through multiple carefully implemented optimizations:\n\n### Performance Optimizations\n\n1. **FxHashMap** - ~15-30% faster string key operations compared to standard HashMap\n   - Optimized hash function for string keys\n   - Reduced collision overhead\n\n2. **SIMD JSON Parsing** - Hardware-accelerated parsing and serialization via simd-json\n   - Leverages CPU SIMD instructions for parallel processing\n   - Significantly faster than standard serde_json for large payloads\n\n3. **Reduced Allocations** - Minimized memory allocations using Cow (Copy-on-Write) and scoped buffers\n   - ~50% reduction in string clones during key transformations\n   - Efficient memory reuse across operations\n\n4. **Smart Capacity Management** - Pre-sized maps and string builders to minimize rehashing\n   - Reduces reallocation overhead\n   - Improves cache locality\n\n5. **Parallel Batch Processing** (built-in, always enabled) - Rayon-based parallelism for batch operations\n   - **3-5x speedup** for batches of 10+ items on multi-core CPUs\n   - Adaptive threshold prevents overhead for small batches\n   - Zero per-item memory overhead\n   - Thread-safe regex cache with Arc<Regex> for O(1) cloning\n\n### Parallel Processing\n\nParallel processing is **built-in and automatic** - no feature flags or special configuration needed!\n\nJSON-Tools-rs provides **two levels of parallelism**:\n\n#### 1. Batch-Level Parallelism (Across Multiple Documents)\n\nProcess multiple JSON documents in parallel automatically.\n\n**Performance Gains:**\n- Batch size 10: **2.5x faster**\n- Batch size 50: **3.3x faster**\n- Batch size 100: **3.3x faster**\n- Batch size 500: **5.3x faster**\n- Batch size 1000: **5.4x faster**\n\n**Configuration (Optional):**\n\n```rust\nuse json_tools_rs::JSONTools;\n\n// Default threshold (10 items) - optimal for most use cases\n// Parallelism activates automatically for batches \u2265 10 items\nlet result = JSONTools::new()\n    .flatten()\n    .execute(batch)?;\n\n// Custom threshold for fine-tuning\nlet result = JSONTools::new()\n    .flatten()\n    .parallel_threshold(50)  // Only parallelize batches \u2265 50 items\n    .execute(batch)?;\n\n// Custom thread count\nlet result = JSONTools::new()\n    .flatten()\n    .num_threads(Some(4))  // Use exactly 4 threads\n    .execute(batch)?;\n\n// Environment variables (runtime configuration)\n// JSON_TOOLS_PARALLEL_THRESHOLD=20 cargo run\n// JSON_TOOLS_NUM_THREADS=4 cargo run\n```\n\n**How it works:**\n- Batches below threshold (default: 10): Sequential processing (no overhead)\n- Batches 10-1000: Rayon work-stealing parallelism\n- Batches > 1000: Chunked processing for optimal cache locality\n- Each worker thread gets its own regex cache\n- Zero per-item memory increase (only 8-16MB one-time thread pool)\n- Thread count defaults to number of logical CPUs (configurable via `num_threads()` or `JSON_TOOLS_NUM_THREADS`)\n\n#### 2. Nested Parallelism (Within Large Documents)\n\nFor large individual JSON documents, nested parallelism automatically parallelizes the processing of large objects and arrays **within** a single document.\n\n**Performance Gains:**\n- Large documents (20,000+ items): **7-12% faster**\n- Very large documents (100,000+ items): **7-12% faster**\n- Small/medium documents: No overhead (stays sequential)\n\n**Configuration (Optional):**\n\n```rust\nuse json_tools_rs::JSONTools;\n\n// Default threshold (100 items) - optimal for most use cases\n// Objects/arrays with 100+ keys/items are processed in parallel\nlet result = JSONTools::new()\n    .flatten()\n    .execute(large_json)?;\n\n// Custom threshold for very large documents\nlet result = JSONTools::new()\n    .flatten()\n    .nested_parallel_threshold(50)  // More aggressive parallelism\n    .execute(large_json)?;\n\n// Disable nested parallelism (for small/medium documents)\nlet result = JSONTools::new()\n    .flatten()\n    .nested_parallel_threshold(usize::MAX)  // Disable\n    .execute(json)?;\n\n// Environment variable (runtime configuration)\n// JSON_TOOLS_NESTED_PARALLEL_THRESHOLD=200 cargo run\n```\n\n**How it works:**\n- Objects/arrays below threshold (default: 100): Sequential processing\n- Objects/arrays above threshold: Parallel processing using Rayon\n- Each parallel branch gets its own string builder\n- Results are merged efficiently with minimal overhead\n- Rayon's work-stealing automatically balances load across CPU cores\n- Minimal memory overhead (< 1 MB for very large documents)\n\n**When to use:**\n- \u2705 Large JSON documents (20,000+ items)\n- \u2705 Very large JSON documents (100,000+ items)\n- \u2705 Wide, flat structures (many keys at same level)\n- \u274c Small documents (< 5,000 items) - no benefit\n- \u274c Deeply nested but narrow structures - marginal benefit\n\n### Benchmark Results\n\nPerformance varies by workload complexity, but typical results on modern hardware include:\n\n- **Basic flattening**: 2,000+ operations/ms\n- **Advanced configuration**: 1,300+ operations/ms (with filtering and transformations)\n- **Regex replacements**: 1,800+ operations/ms (with pattern matching)\n- **Batch processing**: 1,900+ operations/ms (for multiple JSON documents)\n- **Roundtrip operations**: 1,000+ flatten\u2192unflatten cycles/ms\n\n*Note: Benchmarks run on typical development hardware. Your results may vary based on CPU, memory, and workload characteristics.*\n\n### Running Benchmarks\n\n```bash\n# Run comprehensive benchmarks\ncargo bench\n\n# Run specific benchmark suites\ncargo bench flatten\ncargo bench unflatten\ncargo bench roundtrip\n\n# Generate HTML reports (available in target/criterion)\ncargo bench --features html_reports\n```\n\n## API Reference\n\n### JSONTools - Unified API\n\nThe `JSONTools` struct is the single entry point for all JSON manipulation operations. It provides a builder pattern API that works for both flattening and unflattening operations.\n\n#### Core Methods\n\n- **`JSONTools::new()`** - Create a new instance with default settings\n- **`.flatten()`** - Configure for flattening operations (converts nested JSON to flat key-value pairs)\n- **`.unflatten()`** - Configure for unflattening operations (converts flat key-value pairs back to nested JSON)\n- **`.normal()`** - Configure for pass-through operations (apply transformations without flattening/unflattening)\n- **`.execute(input)`** - Execute the configured operation on the provided input\n\n#### Configuration Methods\n\nAll configuration methods are chainable and available for both flattening and unflattening operations:\n\n##### Key/Value Transformation Methods\n\n- **`.separator(sep: &str)`** - Set separator for nested keys (default: `\".\"`)\n  - Example: `separator(\"::\")` makes keys like `user::name::first`\n\n- **`.lowercase_keys(value: bool)`** - Convert all keys to lowercase\n  - Example: `UserName` becomes `username`\n\n- **`.key_replacement(find: &str, replace: &str)`** - Add key replacement pattern\n  - Supports standard Rust regex syntax (automatically detected)\n  - Falls back to literal string replacement if regex compilation fails\n  - Example: `key_replacement(\"(user|admin)_\", \"\")` removes prefixes\n\n- **`.value_replacement(find: &str, replace: &str)`** - Add value replacement pattern\n  - Supports standard Rust regex syntax (automatically detected)\n  - Falls back to literal string replacement if regex compilation fails\n  - Example: `value_replacement(\"@example.com\", \"@company.org\")` updates email domains\n\n##### Filtering Methods\n\nAll filtering methods work for both flatten and unflatten operations:\n\n- **`.remove_empty_strings(value: bool)`** - Remove keys with empty string values (`\"\"`)\n- **`.remove_nulls(value: bool)`** - Remove keys with null values\n- **`.remove_empty_objects(value: bool)`** - Remove keys with empty object values (`{}`)\n- **`.remove_empty_arrays(value: bool)`** - Remove keys with empty array values (`[]`)\n\n##### Collision Handling Methods\n\n- **`.handle_key_collision(value: bool)`** - When enabled, collects values with identical keys into arrays\n  - Useful when transformations cause different keys to become identical\n  - Example: After removing prefixes, `user_name` and `admin_name` both become `name`\n  - With collision handling: `{\"name\": [\"John\", \"Jane\"]}`\n  - Without collision handling: Last value wins\n\n##### Type Conversion Methods\n\n- **`.auto_convert_types(enable: bool)`** - Automatically convert string values to numbers and booleans\n  - **Number conversion**: Handles various formats including:\n    - Basic numbers: `\"123\"` \u2192 `123`, `\"45.67\"` \u2192 `45.67`, `\"-10\"` \u2192 `-10`\n    - Thousands separators: `\"1,234.56\"` \u2192 `1234.56` (US), `\"1.234,56\"` \u2192 `1234.56` (EU)\n    - Currency symbols: `\"$123.45\"` \u2192 `123.45`, `\"\u20ac99.99\"` \u2192 `99.99`\n    - Scientific notation: `\"1e5\"` \u2192 `100000`, `\"1.23e-4\"` \u2192 `0.000123`\n  - **Boolean conversion**: Only these exact variants:\n    - `\"true\"`, `\"TRUE\"`, `\"True\"` \u2192 `true`\n    - `\"false\"`, `\"FALSE\"`, `\"False\"` \u2192 `false`\n  - **Lenient behavior**: If conversion fails, keeps the original string value (no errors thrown)\n  - **Works for all modes**: `.flatten()`, `.unflatten()`, and `.normal()`\n  - **Example**:\n    ```rust\n    let json = r#\"{\"id\": \"123\", \"price\": \"$1,234.56\", \"active\": \"true\"}\"#;\n    let result = JSONTools::new()\n        .flatten()\n        .auto_convert_types(true)\n        .execute(json)?;\n    // Result: {\"id\": 123, \"price\": 1234.56, \"active\": true}\n    ```\n\n#### Input/Output Types\n\n**Rust:**\n- `&str` (JSON string) \u2192 `JsonOutput::Single(String)`\n- `Vec<&str>` or `Vec<String>` \u2192 `JsonOutput::Multiple(Vec<String>)`\n\n**Python (Perfect Type Preservation):**\n- `str` \u2192 `str` (JSON string input \u2192 JSON string output)\n- `dict` \u2192 `dict` (Python dict input \u2192 Python dict output)\n- `List[str]` \u2192 `List[str]` (list of JSON strings \u2192 list of JSON strings)\n- `List[dict]` \u2192 `List[dict]` (list of Python dicts \u2192 list of Python dicts)\n- Mixed lists preserve original element types\n\n### Error Handling\n\nThe library uses a comprehensive `JsonToolsError` enum that provides detailed error information and actionable suggestions for debugging:\n\n#### Error Variants\n\n- **`JsonParseError`** - JSON parsing failures with syntax suggestions\n  - Triggered by: Invalid JSON syntax, malformed input\n  - Suggestion: Verify JSON syntax, check for missing quotes, trailing commas, unescaped characters\n\n- **`RegexError`** - Regex pattern compilation errors with pattern suggestions\n  - Triggered by: Invalid regex patterns in `key_replacement()` or `value_replacement()`\n  - Suggestion: Verify regex syntax using standard Rust regex patterns\n\n- **`InvalidJsonStructure`** - Structure validation errors with format guidance\n  - Triggered by: Incompatible JSON structure for the requested operation\n  - Suggestion: Ensure input matches expected format (nested for flatten, flat for unflatten)\n\n- **`ConfigurationError`** - API usage errors with correct usage examples\n  - Triggered by: Calling `.execute()` without setting operation mode\n  - Suggestion: Call `.flatten()` or `.unflatten()` before `.execute()`\n\n- **`BatchProcessingError`** - Batch operation errors with item-specific details\n  - Triggered by: Invalid item in batch processing\n  - Includes: Index of failing item for easy debugging\n  - Suggestion: Check the JSON at the specified index\n\n- **`InputValidationError`** - Input validation errors with helpful guidance\n  - Triggered by: Invalid input type or empty input\n  - Suggestion: Ensure input is valid JSON string, dict, or list\n\n- **`SerializationError`** - JSON serialization failures with debugging information\n  - Triggered by: Internal serialization errors (rare)\n  - Suggestion: Report as potential bug\n\n#### Error Handling Examples\n\n**Rust:**\n```rust\nuse json_tools_rs::{JSONTools, JsonToolsError};\n\nmatch JSONTools::new().flatten().execute(invalid_json) {\n    Ok(result) => println!(\"Success: {:?}\", result),\n    Err(JsonToolsError::JsonParseError { message, suggestion, .. }) => {\n        eprintln!(\"Parse error: {}\", message);\n        eprintln!(\"\ud83d\udca1 {}\", suggestion);\n    }\n    Err(e) => eprintln!(\"Error: {}\", e),\n}\n```\n\n**Python:**\n```python\nimport json_tools_rs\n\ntry:\n    result = json_tools_rs.JSONTools().flatten().execute(invalid_json)\nexcept json_tools_rs.JsonToolsError as e:\n    print(f\"Error: {e}\")\n    # Error messages include helpful suggestions\n```\n\n## Common Use Cases\n\n### 1. Data Pipeline Transformations\n\nFlatten nested API responses for easier processing in data pipelines:\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\nlet api_response = r#\"{\n    \"user\": {\n        \"id\": 123,\n        \"profile\": {\"name\": \"John\", \"email\": \"john@example.com\"},\n        \"settings\": {\"theme\": \"dark\", \"notifications\": true}\n    }\n}\"#;\n\nlet flattened = JSONTools::new()\n    .flatten()\n    .execute(api_response)?;\n// Result: {\"user.id\": 123, \"user.profile.name\": \"John\", ...}\n// Perfect for CSV export, database insertion, or analytics\n```\n\n### 2. Data Cleaning and Normalization\n\nRemove empty values and normalize keys for consistent data processing:\n\n```python\nimport json_tools_rs as jt\n\n# Clean messy data from external sources\nmessy_data = {\n    \"UserName\": \"Alice\",\n    \"Email\": \"\",           # Empty string\n    \"Age\": None,           # Null value\n    \"Preferences\": {},     # Empty object\n    \"Tags\": []             # Empty array\n}\n\ncleaned = (jt.JSONTools()\n    .flatten()\n    .lowercase_keys(True)\n    .remove_empty_strings(True)\n    .remove_nulls(True)\n    .remove_empty_objects(True)\n    .remove_empty_arrays(True)\n    .execute(messy_data))\n\n# Result: {'username': 'Alice'}\n# All empty/null values removed, keys normalized\n```\n\n### 3. Configuration File Processing\n\nTransform between flat and nested configuration formats:\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\n// Convert flat environment-style config to nested structure\nlet flat_config = r#\"{\n    \"database.host\": \"localhost\",\n    \"database.port\": 5432,\n    \"database.name\": \"myapp\",\n    \"cache.enabled\": true,\n    \"cache.ttl\": 3600,\n    \"cache.redis.host\": \"redis.local\"\n}\"#;\n\nlet nested = JSONTools::new()\n    .unflatten()\n    .execute(flat_config)?;\n// Result: {\n//   \"database\": {\"host\": \"localhost\", \"port\": 5432, \"name\": \"myapp\"},\n//   \"cache\": {\"enabled\": true, \"ttl\": 3600, \"redis\": {\"host\": \"redis.local\"}}\n// }\n```\n\n### 4. Batch Data Processing\n\nProcess multiple JSON documents efficiently with type preservation:\n\n```python\nimport json_tools_rs as jt\n\n# Process batch of API responses\nresponses = [\n    {\"user\": {\"id\": 1, \"name\": \"Alice\", \"email\": \"alice@example.com\"}},\n    {\"user\": {\"id\": 2, \"name\": \"Bob\", \"email\": \"bob@example.com\"}},\n    {\"user\": {\"id\": 3, \"name\": \"Charlie\", \"email\": \"charlie@example.com\"}}\n]\n\n# Flatten all responses in one call\nflattened_batch = jt.JSONTools().flatten().execute(responses)\n# Result: [\n#   {'user.id': 1, 'user.name': 'Alice', 'user.email': 'alice@example.com'},\n#   {'user.id': 2, 'user.name': 'Bob', 'user.email': 'bob@example.com'},\n#   {'user.id': 3, 'user.name': 'Charlie', 'user.email': 'charlie@example.com'}\n# ]\n```\n\n### 5. Multi-Source Data Aggregation\n\nAggregate data from multiple sources with key collision handling:\n\n```python\nimport json_tools_rs as jt\n\n# Data from different sources with overlapping keys\nuser_data = {\"name\": \"John\", \"source\": \"database\"}\nadmin_data = {\"name\": \"Jane\", \"source\": \"ldap\"}\nguest_data = {\"name\": \"Guest\", \"source\": \"default\"}\n\n# Combine with collision handling\ncombined = jt.JSONTools().flatten().handle_key_collision(True).execute([\n    user_data, admin_data, guest_data\n])\n\n# With collision handling, duplicate keys become arrays\n# Result: [\n#   {'name': 'John', 'source': 'database'},\n#   {'name': 'Jane', 'source': 'ldap'},\n#   {'name': 'Guest', 'source': 'default'}\n# ]\n```\n\n### 6. ETL Pipeline: Extract, Transform, Load\n\nComplete ETL workflow with data transformation:\n\n```rust\nuse json_tools_rs::{JSONTools, JsonOutput};\n\n// Extract: Raw data from source\nlet raw_data = r#\"{\n    \"USER_ID\": 12345,\n    \"USER_PROFILE\": {\n        \"FIRST_NAME\": \"John\",\n        \"LAST_NAME\": \"Doe\",\n        \"EMAIL_ADDRESS\": \"john.doe@oldcompany.com\",\n        \"METADATA\": {\"created\": \"\", \"updated\": null}\n    }\n}\"#;\n\n// Transform: Clean and normalize\nlet transformed = JSONTools::new()\n    .flatten()\n    .lowercase_keys(true)                              // Normalize keys\n    .key_replacement(\"user_profile.\", \"\")              // Remove prefix\n    .value_replacement(\"@oldcompany.com\", \"@newcompany.com\")  // Update domain\n    .remove_empty_strings(true)                        // Clean empty values\n    .remove_nulls(true)                                // Remove nulls\n    .execute(raw_data)?;\n\n// Load: Result ready for database insertion\n// Result: {\n//   \"user_id\": 12345,\n//   \"first_name\": \"John\",\n//   \"last_name\": \"Doe\",\n//   \"email_address\": \"john.doe@newcompany.com\"\n// }\n```\n\n## Examples and Testing\n\n### Running Examples\n\n**Rust Examples:**\n```bash\n# Basic usage examples\ncargo run --example basic_usage\n\n# View all available examples\nls examples/\n```\n\n**Python Examples:**\n```bash\n# Basic usage with type preservation\npython python/examples/basic_usage.py\n\n# Advanced features and collision handling\npython python/examples/examples.py\n```\n\n### Running Tests\n\n**Rust Tests:**\n```bash\n# Run all Rust tests\ncargo test\n\n# Run tests with verbose output\ncargo test -- --nocapture\n\n# Run tests with Python features enabled\ncargo test --features python\n\n# Run specific test module\ncargo test test_module_name\n```\n\n**Python Tests:**\n```bash\n# Install test dependencies\npip install pytest\n\n# Build the Python package first\nmaturin develop --features python\n\n# Run all Python tests\npython -m pytest python/tests/\n\n# Run with verbose output\npython -m pytest python/tests/ -v\n\n# Run specific test file\npython -m pytest python/tests/tests.py::TestClassName\n```\n\n## Limitations and Known Issues\n\n### Current Limitations\n\n1. **Array Index Notation**: Arrays are flattened using numeric indices (e.g., `array.0`, `array.1`). Custom array handling is not currently supported.\n\n2. **Separator Constraints**: The separator cannot contain characters that are valid in JSON keys without escaping. Choose separators carefully to avoid conflicts.\n\n3. **Regex Syntax**: Only standard Rust regex syntax is supported. Some advanced regex features may not be available.\n\n4. **Memory Usage**: For very large JSON documents (>100MB), consider processing in smaller batches to optimize memory usage.\n\n### Workarounds\n\n**For custom array handling:**\n```rust\n// Pre-process arrays before flattening if custom handling is needed\n// Or post-process the flattened result to transform array indices\n```\n\n**For separator conflicts:**\n```rust\n// Use a separator that won't appear in your keys\nJSONTools::new().flatten().separator(\"::\").execute(json)?\n```\n\n### Reporting Issues\n\nIf you encounter a bug or have a feature request, please [open an issue](https://github.com/amaye15/JSON-Tools-rs/issues) on GitHub with:\n- A minimal reproducible example\n- Expected vs. actual behavior\n- Your environment (Rust version, OS, etc.)\n\n## Frequently Asked Questions (FAQ)\n\n### General Questions\n\n**Q: What's the difference between `.flatten()` and `.unflatten()`?**\n\nA: `.flatten()` converts nested JSON structures into flat key-value pairs with dot-separated keys. `.unflatten()` does the reverse, converting flat key-value pairs back into nested structures.\n\n```rust\n// Flatten: {\"user\": {\"name\": \"John\"}} \u2192 {\"user.name\": \"John\"}\n// Unflatten: {\"user.name\": \"John\"} \u2192 {\"user\": {\"name\": \"John\"}}\n```\n\n**Q: Can I use the same configuration methods for both flatten and unflatten?**\n\nA: Yes! All configuration methods (filtering, transformations, etc.) work for both operations. The library applies them intelligently based on the operation mode.\n\n**Q: What happens if I don't call `.flatten()` or `.unflatten()` before `.execute()`?**\n\nA: You'll get a `ConfigurationError` with a helpful message telling you to set the operation mode first.\n\n### Python-Specific Questions\n\n**Q: What input types does the Python API support?**\n\nA: The Python API supports:\n- `str` (JSON strings)\n- `dict` (Python dictionaries)\n- `List[str]` (lists of JSON strings)\n- `List[dict]` (lists of Python dictionaries)\n- Mixed lists (preserves original types)\n\n**Q: Does the output type always match the input type?**\n\nA: Yes! This is a key feature. `str` input \u2192 `str` output, `dict` input \u2192 `dict` output, etc. This makes the API predictable and easy to use.\n\n### Performance Questions\n\n**Q: How does performance compare to other JSON libraries?**\n\nA: JSON Tools RS is optimized for high performance with SIMD-accelerated parsing, FxHashMap, and reduced allocations. Benchmarks show 2,000+ operations/ms for basic flattening. See the [Performance](#performance) section for details.\n\n**Q: Is it safe to use in production?**\n\nA: Yes! The library includes comprehensive error handling, extensive test coverage, and has been optimized for both correctness and performance.\n\n### Feature Questions\n\n**Q: How do I handle key collisions?**\n\nA: Use `.handle_key_collision(true)` to collect colliding values into arrays. For example, if transformations cause `user_name` and `admin_name` to both become `name`, the result will be `{\"name\": [\"John\", \"Jane\"]}`.\n\n**Q: Can I use regex patterns in replacements?**\n\nA: Yes! Both `.key_replacement()` and `.value_replacement()` support standard Rust regex syntax. The library automatically detects regex patterns and falls back to literal replacement if the pattern is invalid.\n\n**Q: What filtering options are available?**\n\nA: You can remove:\n- Empty strings: `.remove_empty_strings(true)`\n- Null values: `.remove_nulls(true)`\n- Empty objects: `.remove_empty_objects(true)`\n- Empty arrays: `.remove_empty_arrays(true)`\n\nAll filtering methods work for both flatten and unflatten operations.\n\n**Q: Can I process multiple JSON documents at once?**\n\nA: Yes! Pass a `Vec<String>` in Rust or a `List[str]` or `List[dict]` in Python. The library will process them efficiently in batch mode.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\n\n### Development Setup\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/amaye15/JSON-Tools-rs.git\n   cd JSON-Tools-rs\n   ```\n\n2. **Install Rust** (latest stable)\n   ```bash\n   curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n   ```\n\n3. **Install Python 3.8+** and maturin for Python bindings\n   ```bash\n   pip install maturin pytest\n   ```\n\n4. **Run tests** to ensure everything works\n   ```bash\n   # Rust tests\n   cargo test\n\n   # Python tests\n   maturin develop --features python\n   python -m pytest python/tests/\n   ```\n\n5. **Run benchmarks** to verify performance\n   ```bash\n   cargo bench\n   ```\n\n### Contribution Guidelines\n\n- Write tests for new features\n- Update documentation for API changes\n- Run `cargo fmt` and `cargo clippy` before submitting\n- Ensure all tests pass before creating a PR\n- Add examples for significant new features\n\n## License\n\nThis project is licensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n- MIT License ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\n## Changelog\n\n### v0.4.0 (Current)\n- Comprehensive README documentation update\n- Enhanced API reference with detailed method descriptions\n- Improved error handling documentation with examples\n- Updated installation instructions\n- Added contribution guidelines\n- Performance optimization details and benchmarking guide\n\n### v0.3.0\n- Performance optimizations (FxHashMap, SIMD parsing, reduced allocations)\n- Enhanced error messages with actionable suggestions\n- Improved Python bindings stability\n- Bug fixes and code quality improvements\n\n### v0.2.0\n- Updated README with comprehensive documentation\n- Improved API documentation and examples\n- Enhanced Python bindings documentation\n- Performance optimization details\n- Complete error handling documentation\n\n### v0.1.0\n- Initial release with unified JSONTools API\n- Complete flattening and unflattening support\n- Advanced filtering and transformation capabilities\n- Key collision handling with `.handle_key_collision()`\n- Python bindings with perfect type matching\n- Comprehensive error handling with detailed suggestions\n\n",
    "bugtrack_url": null,
    "license": "MIT OR Apache-2.0",
    "summary": "High-performance JSON manipulation library with SIMD-accelerated parsing and automatic type conversion",
    "version": "0.7.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/amaye15/JSON-Tools-rs/issues",
        "Documentation": "https://github.com/amaye15/JSON-Tools-rs#readme",
        "Homepage": "https://github.com/amaye15/JSON-Tools-rs",
        "Repository": "https://github.com/amaye15/JSON-Tools-rs"
    },
    "split_keywords": [
        "json",
        " flatten",
        " manipulation",
        " parsing",
        " rust",
        " simd",
        " performance"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "36d81805b03c3549219f30662139e3bda2229abf73d6be715bb56fd50355b324",
                "md5": "90f2edc3c2270d0faac1542a6368fe36",
                "sha256": "37a0bd37aee9eaf9fcde66ae2df2e6c5716111bf69e18dc3e12434c68f692a77"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "90f2edc3c2270d0faac1542a6368fe36",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1012245,
            "upload_time": "2025-10-17T16:37:30",
            "upload_time_iso_8601": "2025-10-17T16:37:30.765800Z",
            "url": "https://files.pythonhosted.org/packages/36/d8/1805b03c3549219f30662139e3bda2229abf73d6be715bb56fd50355b324/json_tools_rs-0.7.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa6715fe2f70bbbdedbb69f9d51073333715ac858b10edf84851a5ee4bc8bffe",
                "md5": "3444161ab9a1b35adb6d259819759a3f",
                "sha256": "e97521c9198556d3f61f9fe1c5a714d66699ddcb5274145a379775cd860ecede"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "3444161ab9a1b35adb6d259819759a3f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 929704,
            "upload_time": "2025-10-17T16:36:40",
            "upload_time_iso_8601": "2025-10-17T16:36:40.569774Z",
            "url": "https://files.pythonhosted.org/packages/aa/67/15fe2f70bbbdedbb69f9d51073333715ac858b10edf84851a5ee4bc8bffe/json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e8766d7db2df20a1977d0e39cd38790a5db1fdef249db9b2b4e19b3f714fc0aa",
                "md5": "1635bd2300536061194600278607edd4",
                "sha256": "eec1d5fea5d2e15733e102d344a26b40999f24fc6f6c1a29842c546e80aef1c6"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "1635bd2300536061194600278607edd4",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 922539,
            "upload_time": "2025-10-17T16:36:58",
            "upload_time_iso_8601": "2025-10-17T16:36:58.379561Z",
            "url": "https://files.pythonhosted.org/packages/e8/76/6d7db2df20a1977d0e39cd38790a5db1fdef249db9b2b4e19b3f714fc0aa/json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "08285bbfdeb36b7df3db5bec536ba514f6c1f2e154d797b78082b98ea621c3d3",
                "md5": "6d7820f010e8f548a2fc15032239a5fc",
                "sha256": "10bcb511cfc3d1e8a83bdb662457480977bea0f90b9863cc5bcbd6f2edf6bde0"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "6d7820f010e8f548a2fc15032239a5fc",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1052064,
            "upload_time": "2025-10-17T16:37:14",
            "upload_time_iso_8601": "2025-10-17T16:37:14.883603Z",
            "url": "https://files.pythonhosted.org/packages/08/28/5bbfdeb36b7df3db5bec536ba514f6c1f2e154d797b78082b98ea621c3d3/json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "172078fba7799eb6efe7131c7c3f0cba2bafb2feeccb985d5c038afd10e9f448",
                "md5": "0d16009676eb8b18ccb9c35ff71053d2",
                "sha256": "0802d146c1592c80c312936435e309cb604fecf6163ff06b99546b722ce5a0d3"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0d16009676eb8b18ccb9c35ff71053d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1011523,
            "upload_time": "2025-10-17T16:37:43",
            "upload_time_iso_8601": "2025-10-17T16:37:43.931067Z",
            "url": "https://files.pythonhosted.org/packages/17/20/78fba7799eb6efe7131c7c3f0cba2bafb2feeccb985d5c038afd10e9f448/json_tools_rs-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5dee111c5f3bd7c9f8cf7a4475e170e7edd67d846cee8b10f8b874f003d2c661",
                "md5": "294e9c73195fea609a800690ada38cc3",
                "sha256": "d68998068014504d048d6525ee25a779107ab0b3678b51c48ea7b0e25f1357c8"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "294e9c73195fea609a800690ada38cc3",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1110728,
            "upload_time": "2025-10-17T16:38:08",
            "upload_time_iso_8601": "2025-10-17T16:38:08.690320Z",
            "url": "https://files.pythonhosted.org/packages/5d/ee/111c5f3bd7c9f8cf7a4475e170e7edd67d846cee8b10f8b874f003d2c661/json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "af72b58df6299c9cccdc5d371f8a72d5ecf5c06fcdeb9c0aa484e48ce7653b14",
                "md5": "cda9decaa8cb00411af71c4b421704b8",
                "sha256": "e5e3b3cc80df91d8979965df60573c15586848044d2b0fb7ff65ca399a31b7ec"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "cda9decaa8cb00411af71c4b421704b8",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1187906,
            "upload_time": "2025-10-17T16:38:27",
            "upload_time_iso_8601": "2025-10-17T16:38:27.969187Z",
            "url": "https://files.pythonhosted.org/packages/af/72/b58df6299c9cccdc5d371f8a72d5ecf5c06fcdeb9c0aa484e48ce7653b14/json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c9c0080946b05a019c00810ae21d79c7fe0c57d730999c11ed237031dc5ff2c4",
                "md5": "8568361eaa17a7f5fa2cb71cda1b7775",
                "sha256": "e9b89463e56a80765649d5ef80438c548b3df7215056014f0509e29e15565144"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "8568361eaa17a7f5fa2cb71cda1b7775",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1168216,
            "upload_time": "2025-10-17T16:38:46",
            "upload_time_iso_8601": "2025-10-17T16:38:46.525763Z",
            "url": "https://files.pythonhosted.org/packages/c9/c0/080946b05a019c00810ae21d79c7fe0c57d730999c11ed237031dc5ff2c4/json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "87992eb80257ff52c9efe59c0df8e5625c29eac187c63141ea24eb076d3238d5",
                "md5": "14bc82d1c90603ffd2f6c20a3840e460",
                "sha256": "0969ddc3a5b04f66e87ffd22bc176cc1aa39664e993e54f7ab1942d64c6da0a4"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "14bc82d1c90603ffd2f6c20a3840e460",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1193947,
            "upload_time": "2025-10-17T16:39:02",
            "upload_time_iso_8601": "2025-10-17T16:39:02.858935Z",
            "url": "https://files.pythonhosted.org/packages/87/99/2eb80257ff52c9efe59c0df8e5625c29eac187c63141ea24eb076d3238d5/json_tools_rs-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "260b7a8f476738ab6743ca4a5b014890974fe90a8014654b89ef6774bb6786d4",
                "md5": "9312e4de99423f65c77d6de0f23b482f",
                "sha256": "e146e50008fdeffcc478110da346eac33658483603b5b124d063b734cc77263d"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9312e4de99423f65c77d6de0f23b482f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 936797,
            "upload_time": "2025-10-17T16:39:20",
            "upload_time_iso_8601": "2025-10-17T16:39:20.792614Z",
            "url": "https://files.pythonhosted.org/packages/26/0b/7a8f476738ab6743ca4a5b014890974fe90a8014654b89ef6774bb6786d4/json_tools_rs-0.7.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30c239f5d136e3273132fd0d86d7a5992723e1e43263d9e8d83210dacec77012",
                "md5": "a1d3c2564070d8891b7658f3b3639ef6",
                "sha256": "238c41a50f11950fc5a073f0dfd6458f0483685afcfe0185f2a5d8e2cdae6dae"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a1d3c2564070d8891b7658f3b3639ef6",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 946728,
            "upload_time": "2025-10-17T16:38:03",
            "upload_time_iso_8601": "2025-10-17T16:38:03.760446Z",
            "url": "https://files.pythonhosted.org/packages/30/c2/39f5d136e3273132fd0d86d7a5992723e1e43263d9e8d83210dacec77012/json_tools_rs-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e0dea463abc14c0b1b0df2c66d1c53bb3346af2e58029964608d0011adde924b",
                "md5": "9aed2ff58f076563ba15976c61e6fff0",
                "sha256": "54ed8523f5c88a2f17ff081d87ba15de9b3ccfb65983c69bcf68cf1aa5045a19"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "9aed2ff58f076563ba15976c61e6fff0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 874681,
            "upload_time": "2025-10-17T16:37:57",
            "upload_time_iso_8601": "2025-10-17T16:37:57.220296Z",
            "url": "https://files.pythonhosted.org/packages/e0/de/a463abc14c0b1b0df2c66d1c53bb3346af2e58029964608d0011adde924b/json_tools_rs-0.7.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ad991c1250ca7765a022c2806f5a8d3a712631aba87392fab746b3f6543dd04e",
                "md5": "fd98368697eece15d5d95eae8f580bd0",
                "sha256": "8d4fc74534bcd4ab1808465f008ffffa44d83b70cf3e4384d04ca8180ca1765e"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "fd98368697eece15d5d95eae8f580bd0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1012329,
            "upload_time": "2025-10-17T16:37:32",
            "upload_time_iso_8601": "2025-10-17T16:37:32.318840Z",
            "url": "https://files.pythonhosted.org/packages/ad/99/1c1250ca7765a022c2806f5a8d3a712631aba87392fab746b3f6543dd04e/json_tools_rs-0.7.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9add5c8c43c57fa90f63e0b55706a0a56a73801b04fd3ba1451384d708a40a7d",
                "md5": "0e7244c959e8038f6ac92dd0c1f61825",
                "sha256": "4042d909eff081f004aa46bd78d0add53f7b789192521ec06b5756b87355358e"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "0e7244c959e8038f6ac92dd0c1f61825",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 929608,
            "upload_time": "2025-10-17T16:36:42",
            "upload_time_iso_8601": "2025-10-17T16:36:42.784143Z",
            "url": "https://files.pythonhosted.org/packages/9a/dd/5c8c43c57fa90f63e0b55706a0a56a73801b04fd3ba1451384d708a40a7d/json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cc2a79f40484acedfb8f045a51d927ccf8af264970d56e2ec0d95ab1b313d47c",
                "md5": "bb9977992dbea2adbc058d085769ec39",
                "sha256": "f842ed40aa999534d5ddb0874912b3dcc0b742c3414423288ac1adb98e49e57e"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "bb9977992dbea2adbc058d085769ec39",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 922151,
            "upload_time": "2025-10-17T16:37:00",
            "upload_time_iso_8601": "2025-10-17T16:37:00.190565Z",
            "url": "https://files.pythonhosted.org/packages/cc/2a/79f40484acedfb8f045a51d927ccf8af264970d56e2ec0d95ab1b313d47c/json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3fe60c04d28d78a8931f71c6df9171043c7743e7718a780d89e8bf202337ebfa",
                "md5": "5ae28626c4160cde111a726d5afd594a",
                "sha256": "e4543a2e68eaf1f7220c72771dbc6b1b1d2dc19de351535210c8162e36b594f9"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "5ae28626c4160cde111a726d5afd594a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1052017,
            "upload_time": "2025-10-17T16:37:16",
            "upload_time_iso_8601": "2025-10-17T16:37:16.373671Z",
            "url": "https://files.pythonhosted.org/packages/3f/e6/0c04d28d78a8931f71c6df9171043c7743e7718a780d89e8bf202337ebfa/json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d4b281c2a8d58870b327d14be2e056dbb921f1aaec308cf970c1594a63e935aa",
                "md5": "4564930daab761e239e11f82ba0dc698",
                "sha256": "30e5e4cd601587cbce3af2fd7e9f96ed3911afdde4a31bee6275d48d5dc88838"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4564930daab761e239e11f82ba0dc698",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1011436,
            "upload_time": "2025-10-17T16:37:45",
            "upload_time_iso_8601": "2025-10-17T16:37:45.398855Z",
            "url": "https://files.pythonhosted.org/packages/d4/b2/81c2a8d58870b327d14be2e056dbb921f1aaec308cf970c1594a63e935aa/json_tools_rs-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c0dc99cd698493b4d829752650eaf4f0dd9057643c61be79b3ff4da54003818e",
                "md5": "d353bf91cb68df0b2e331f029d172471",
                "sha256": "0a480ceddf68ece2d59ccdc324664757c922a3f1d6af925779dfa4ee289cd5f8"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d353bf91cb68df0b2e331f029d172471",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1110744,
            "upload_time": "2025-10-17T16:38:10",
            "upload_time_iso_8601": "2025-10-17T16:38:10.307955Z",
            "url": "https://files.pythonhosted.org/packages/c0/dc/99cd698493b4d829752650eaf4f0dd9057643c61be79b3ff4da54003818e/json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c4f7752020cae647995d6a21b43684b72b68567bba7d3a48da6f67d1be0ced8c",
                "md5": "0dfb44c9a5c7d3785b7c382d5dfe6717",
                "sha256": "5bc4af0684d2aaa6fb35b4c0fdfdb838c164c3a31d78088b3bdd130b05724468"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "0dfb44c9a5c7d3785b7c382d5dfe6717",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1187481,
            "upload_time": "2025-10-17T16:38:30",
            "upload_time_iso_8601": "2025-10-17T16:38:30.027926Z",
            "url": "https://files.pythonhosted.org/packages/c4/f7/752020cae647995d6a21b43684b72b68567bba7d3a48da6f67d1be0ced8c/json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0dc62040d2216d873ab811e63997b4174e6416ec9fd0354fe02769ad8e1e89e3",
                "md5": "15d835877af1f61811608b03f4a25269",
                "sha256": "32bdc926af07cba77cadfd26700209be248f04d5d76f0de6aa5f2067cf7bcb6d"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "15d835877af1f61811608b03f4a25269",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1168366,
            "upload_time": "2025-10-17T16:38:48",
            "upload_time_iso_8601": "2025-10-17T16:38:48.086095Z",
            "url": "https://files.pythonhosted.org/packages/0d/c6/2040d2216d873ab811e63997b4174e6416ec9fd0354fe02769ad8e1e89e3/json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d021ff1cbd464588af637a7849827b34e9b1d5635b2e9b8b9bee861aea69164c",
                "md5": "5d94af0053ce101b9140b7e5f6daebe3",
                "sha256": "85fd6aa266e44a32cd9ea6f329641f7f70e5721d1058714347e46a402b94a005"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5d94af0053ce101b9140b7e5f6daebe3",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1193783,
            "upload_time": "2025-10-17T16:39:04",
            "upload_time_iso_8601": "2025-10-17T16:39:04.488717Z",
            "url": "https://files.pythonhosted.org/packages/d0/21/ff1cbd464588af637a7849827b34e9b1d5635b2e9b8b9bee861aea69164c/json_tools_rs-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f031648c0b93b746df3d4d5f1dc377debce842e595d71e4e5075da73255e0415",
                "md5": "7f1d95eb564efe90f2b154d89c5cc9e5",
                "sha256": "9a8953e7b2b61ed47a8160d27cb57e514653d1a7f62b11f4671685b550992621"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7f1d95eb564efe90f2b154d89c5cc9e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 936433,
            "upload_time": "2025-10-17T16:39:22",
            "upload_time_iso_8601": "2025-10-17T16:39:22.758684Z",
            "url": "https://files.pythonhosted.org/packages/f0/31/648c0b93b746df3d4d5f1dc377debce842e595d71e4e5075da73255e0415/json_tools_rs-0.7.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ef548620feb65827142304bb03c11f0fb23d990f9bfbfd4295d6d874618deed9",
                "md5": "b451a8a1b594535b876dde8a92b09140",
                "sha256": "d697996b3434f2d40d938e2337d762b175750c079c9dbbcba98d4ed1f4c2b052"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b451a8a1b594535b876dde8a92b09140",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 946687,
            "upload_time": "2025-10-17T16:38:05",
            "upload_time_iso_8601": "2025-10-17T16:38:05.353403Z",
            "url": "https://files.pythonhosted.org/packages/ef/54/8620feb65827142304bb03c11f0fb23d990f9bfbfd4295d6d874618deed9/json_tools_rs-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c05e591cca5289cf27bf4b5e1e143dfdbc8cc9aa871b05d52cd90c4cdce626bf",
                "md5": "dee05db8d30ec133ca141aafd8d080c8",
                "sha256": "4a40933af75d2f7fb787c398cc59e0304966e82a78f4a340e1bb4f75fbd27277"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "dee05db8d30ec133ca141aafd8d080c8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 875136,
            "upload_time": "2025-10-17T16:37:58",
            "upload_time_iso_8601": "2025-10-17T16:37:58.955610Z",
            "url": "https://files.pythonhosted.org/packages/c0/5e/591cca5289cf27bf4b5e1e143dfdbc8cc9aa871b05d52cd90c4cdce626bf/json_tools_rs-0.7.0-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "220c9a7f1b807b2ab17e52c13bccd561c841d275d484d34c8c40f5721ce0aca9",
                "md5": "67af85a2d96498113c1287867b58a1dc",
                "sha256": "4d0f2c340b54faae02940952d29c360db0dd335b009b5b916c08b2d3148bde45"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "67af85a2d96498113c1287867b58a1dc",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1010824,
            "upload_time": "2025-10-17T16:37:33",
            "upload_time_iso_8601": "2025-10-17T16:37:33.977083Z",
            "url": "https://files.pythonhosted.org/packages/22/0c/9a7f1b807b2ab17e52c13bccd561c841d275d484d34c8c40f5721ce0aca9/json_tools_rs-0.7.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dbc87a7ca3d8e6fbb248d3e016900d3567c5cb9ee701b0c59964edcbb8cd2c9c",
                "md5": "3e8db24c2d873d8d009e29561e05820e",
                "sha256": "5c285be0c7bceb044863145d64fad6e83b691048d0611eb37d7026a6b4d35eec"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "3e8db24c2d873d8d009e29561e05820e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 928550,
            "upload_time": "2025-10-17T16:36:44",
            "upload_time_iso_8601": "2025-10-17T16:36:44.602505Z",
            "url": "https://files.pythonhosted.org/packages/db/c8/7a7ca3d8e6fbb248d3e016900d3567c5cb9ee701b0c59964edcbb8cd2c9c/json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f4eca7489ae9ce3d9194e982ce6a9f31744a60fe86ebf7b8f8f47c48b25d4a0c",
                "md5": "19d248360ee6337d134bc1e377b3f630",
                "sha256": "81f319df409a2d85ace09e9752f3ce912f1a4f39df704a158c6bdc21a3e63cef"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "19d248360ee6337d134bc1e377b3f630",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 920935,
            "upload_time": "2025-10-17T16:37:02",
            "upload_time_iso_8601": "2025-10-17T16:37:02.288807Z",
            "url": "https://files.pythonhosted.org/packages/f4/ec/a7489ae9ce3d9194e982ce6a9f31744a60fe86ebf7b8f8f47c48b25d4a0c/json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "840540f6d25789267251bc12daecf470490fa02935a6e412e5f9e9eb1a831d34",
                "md5": "ad8c6bdf3a4413faa8dc6c48e91b13d9",
                "sha256": "b65f039a9eecf7e3fd9a800c97a41fcde4e4c1c1c772bfb1e3dd9b9ed9290817"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "ad8c6bdf3a4413faa8dc6c48e91b13d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1050458,
            "upload_time": "2025-10-17T16:37:17",
            "upload_time_iso_8601": "2025-10-17T16:37:17.945078Z",
            "url": "https://files.pythonhosted.org/packages/84/05/40f6d25789267251bc12daecf470490fa02935a6e412e5f9e9eb1a831d34/json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ffeda257fd82e6b5a3de4010834cfe3550561089b2c1d5dae81a4ecc27965373",
                "md5": "2580bdc4d2740d7f87c6727596591225",
                "sha256": "992d17a65584705c802c0d65549ae8731c440620dac24eef8b0fc4d3002294f9"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2580bdc4d2740d7f87c6727596591225",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1009623,
            "upload_time": "2025-10-17T16:37:46",
            "upload_time_iso_8601": "2025-10-17T16:37:46.874231Z",
            "url": "https://files.pythonhosted.org/packages/ff/ed/a257fd82e6b5a3de4010834cfe3550561089b2c1d5dae81a4ecc27965373/json_tools_rs-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa4298b45ef4259b0500f9a40f864859e038213dede7c490b2ec9ed4e218a753",
                "md5": "06a28a7a4edb275c2968d903ef3e0e6c",
                "sha256": "23f0f9fb09fce424c8793c824dcccd36e690ced0be8c6d9c4384cefad5e15e91"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "06a28a7a4edb275c2968d903ef3e0e6c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1110450,
            "upload_time": "2025-10-17T16:38:11",
            "upload_time_iso_8601": "2025-10-17T16:38:11.835858Z",
            "url": "https://files.pythonhosted.org/packages/aa/42/98b45ef4259b0500f9a40f864859e038213dede7c490b2ec9ed4e218a753/json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6b8bbb56bdad517e361be37f920864972df2f216585fd1fc4045b029df25af26",
                "md5": "d8effe9967cdb93af660cbe6e9b09e17",
                "sha256": "c94538d4a2032a6d760c38761800690cc28a16affd21ec5c952c52dcd190c090"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "d8effe9967cdb93af660cbe6e9b09e17",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1186390,
            "upload_time": "2025-10-17T16:38:31",
            "upload_time_iso_8601": "2025-10-17T16:38:31.557636Z",
            "url": "https://files.pythonhosted.org/packages/6b/8b/bb56bdad517e361be37f920864972df2f216585fd1fc4045b029df25af26/json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "726d3042954dee0f8edf839f61281b8472eb79f9fe96e2d318ead19a27a130f0",
                "md5": "8b0b91fd874c3689f7b65bf513936581",
                "sha256": "7e3cc05fdbb1e27ff62ce8e70cf6af12dd79d34a92251928af79f1edeec6fcf2"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "8b0b91fd874c3689f7b65bf513936581",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1167767,
            "upload_time": "2025-10-17T16:38:49",
            "upload_time_iso_8601": "2025-10-17T16:38:49.615283Z",
            "url": "https://files.pythonhosted.org/packages/72/6d/3042954dee0f8edf839f61281b8472eb79f9fe96e2d318ead19a27a130f0/json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d60ab5dfb17234e8644c9f7b7dc77d81ba3fb12927575a12dcf6081b1ae8614f",
                "md5": "ccf1f76dc58c00ad85058bdb151080e9",
                "sha256": "4fa357c2ecacb1eb390e664553559447a48cf66bfb4137542ec75f827381c4fd"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ccf1f76dc58c00ad85058bdb151080e9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 1192887,
            "upload_time": "2025-10-17T16:39:06",
            "upload_time_iso_8601": "2025-10-17T16:39:06.440385Z",
            "url": "https://files.pythonhosted.org/packages/d6/0a/b5dfb17234e8644c9f7b7dc77d81ba3fb12927575a12dcf6081b1ae8614f/json_tools_rs-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "17f89ff4b184cf984486841ace6f42fd285cb2af95f5516fe6022645f66094db",
                "md5": "b98e8745e7e7f7e201bf27d5ec20dc58",
                "sha256": "cc6700716a1af9a1200c8c48e18a3b76c06887d5481ba363d70124545ae37bfd"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b98e8745e7e7f7e201bf27d5ec20dc58",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 937021,
            "upload_time": "2025-10-17T16:39:24",
            "upload_time_iso_8601": "2025-10-17T16:39:24.249577Z",
            "url": "https://files.pythonhosted.org/packages/17/f8/9ff4b184cf984486841ace6f42fd285cb2af95f5516fe6022645f66094db/json_tools_rs-0.7.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a51008c79ebd7f27cc97fc2cf0e351e0c2038680b1c5ad504174c3cc40ea3498",
                "md5": "a0a9f1ed16c5076b334d2c5126862abd",
                "sha256": "58426d4563b4e184bb2142e3f264d489b7580c142ef5268dcc0e669257bf5d2c"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a0a9f1ed16c5076b334d2c5126862abd",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 946540,
            "upload_time": "2025-10-17T16:38:06",
            "upload_time_iso_8601": "2025-10-17T16:38:06.935359Z",
            "url": "https://files.pythonhosted.org/packages/a5/10/08c79ebd7f27cc97fc2cf0e351e0c2038680b1c5ad504174c3cc40ea3498/json_tools_rs-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e960bfb3bb0c2fcf5ff84e81b3b99d3e0b4ab74601e514994f7551d413430973",
                "md5": "0af42f82a23a1149f69b93b9f7c03432",
                "sha256": "964d02b97094fb5a601deb81bf64fc2dd68c236da6f576a109cd52976a2c3744"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "0af42f82a23a1149f69b93b9f7c03432",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 874744,
            "upload_time": "2025-10-17T16:38:00",
            "upload_time_iso_8601": "2025-10-17T16:38:00.605783Z",
            "url": "https://files.pythonhosted.org/packages/e9/60/bfb3bb0c2fcf5ff84e81b3b99d3e0b4ab74601e514994f7551d413430973/json_tools_rs-0.7.0-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30ae5d0cca1adbe206363d2f29362c276b5548509c2df593d12f17ea8e5a2c34",
                "md5": "73ce985a131d282b4670ac26f9ba38fd",
                "sha256": "d4d4269649b363b73d42552796e9b3f11946a605786c49a34748b4a803e69d04"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "73ce985a131d282b4670ac26f9ba38fd",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1010415,
            "upload_time": "2025-10-17T16:37:35",
            "upload_time_iso_8601": "2025-10-17T16:37:35.717931Z",
            "url": "https://files.pythonhosted.org/packages/30/ae/5d0cca1adbe206363d2f29362c276b5548509c2df593d12f17ea8e5a2c34/json_tools_rs-0.7.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "06773358448a309e9732f817a0e1dd4b817f2d02f4e6e31c1cce83cd7ea4e976",
                "md5": "d01de5f84df0fa653f5e1d20e11cb2d5",
                "sha256": "2a0f7e48e1bb043ac81d339c0acf935d5453c08d65a8ef0cd452bb443f964620"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d01de5f84df0fa653f5e1d20e11cb2d5",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 928305,
            "upload_time": "2025-10-17T16:36:46",
            "upload_time_iso_8601": "2025-10-17T16:36:46.393230Z",
            "url": "https://files.pythonhosted.org/packages/06/77/3358448a309e9732f817a0e1dd4b817f2d02f4e6e31c1cce83cd7ea4e976/json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f485f264441190b77cb8baa6bf10a6754226d4ddaf8859f5b6103b7548668e4e",
                "md5": "f640dbe50bfcb452c65fb6b59c8d9ff2",
                "sha256": "37ee81b73f3d374cfd4fcb91b781bc3de848c6f89603c7ee41ef24593d923e9d"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "f640dbe50bfcb452c65fb6b59c8d9ff2",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 920380,
            "upload_time": "2025-10-17T16:37:03",
            "upload_time_iso_8601": "2025-10-17T16:37:03.799002Z",
            "url": "https://files.pythonhosted.org/packages/f4/85/f264441190b77cb8baa6bf10a6754226d4ddaf8859f5b6103b7548668e4e/json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "57892594421a3ce0914992db24d46d926e7307af6292634a144cdf77a527c8a3",
                "md5": "17caca8fac4c3e9dd48ca17290cdba15",
                "sha256": "e565383d41486dea7d07526bfe4a46e39ef8c87d848eb4196cfb7c026515c0dc"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "17caca8fac4c3e9dd48ca17290cdba15",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1049429,
            "upload_time": "2025-10-17T16:37:19",
            "upload_time_iso_8601": "2025-10-17T16:37:19.515414Z",
            "url": "https://files.pythonhosted.org/packages/57/89/2594421a3ce0914992db24d46d926e7307af6292634a144cdf77a527c8a3/json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f8de6bdaaeb23be4aac33fb9e8d24d0e0f5161ae61b3769ef8f18f3cc88f4aff",
                "md5": "dffcd1b5b0a83651421ab46cac5db059",
                "sha256": "0bc1908df7c7ff478df3d1154e8b16ffa5787d6f73ffcd336dd48176e2494846"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dffcd1b5b0a83651421ab46cac5db059",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1009059,
            "upload_time": "2025-10-17T16:37:48",
            "upload_time_iso_8601": "2025-10-17T16:37:48.654024Z",
            "url": "https://files.pythonhosted.org/packages/f8/de/6bdaaeb23be4aac33fb9e8d24d0e0f5161ae61b3769ef8f18f3cc88f4aff/json_tools_rs-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ff148ed6c39181a266f1687f5f534db6f995437b71721ae00a027d865d49c7df",
                "md5": "aa35520d129103689e25f5ea78541f76",
                "sha256": "a17678987eef9685742a8f94fe5e55f94848543196f007201ace523e05a2d2ea"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "aa35520d129103689e25f5ea78541f76",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1109722,
            "upload_time": "2025-10-17T16:38:13",
            "upload_time_iso_8601": "2025-10-17T16:38:13.412675Z",
            "url": "https://files.pythonhosted.org/packages/ff/14/8ed6c39181a266f1687f5f534db6f995437b71721ae00a027d865d49c7df/json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "763594ab94ffbe8ffb4770d08622ceb56d59e4305159b2dda5a3ea15b6f595d7",
                "md5": "07615398d5bac93ad22dafd38d371324",
                "sha256": "1f7e80f2839867fdde9024d86d9462caed09ce14da9649ae57e53cddedacec41"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "07615398d5bac93ad22dafd38d371324",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1185831,
            "upload_time": "2025-10-17T16:38:33",
            "upload_time_iso_8601": "2025-10-17T16:38:33.128313Z",
            "url": "https://files.pythonhosted.org/packages/76/35/94ab94ffbe8ffb4770d08622ceb56d59e4305159b2dda5a3ea15b6f595d7/json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8219b88c84b78b554b9cdb25fed408d833a9274208d1a48906871a87207fbc7c",
                "md5": "b56fafbbd3119da8095987a508ef6f2c",
                "sha256": "c276f8b6f63b3384ea0d9ef0b14f2d996b1a52bd1bec3ca914f6f483ef03eda7"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "b56fafbbd3119da8095987a508ef6f2c",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1167288,
            "upload_time": "2025-10-17T16:38:51",
            "upload_time_iso_8601": "2025-10-17T16:38:51.259754Z",
            "url": "https://files.pythonhosted.org/packages/82/19/b88c84b78b554b9cdb25fed408d833a9274208d1a48906871a87207fbc7c/json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d7a993248c15823a8dde59760bb8e83fa69270a30cde2708dd6356deae4358d8",
                "md5": "9a9f77d6a22bd6370edf6a27aac2a879",
                "sha256": "29efd83752acf51ed8c136e7f62750a9bb2e716478b575146ada65c886ac0640"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9a9f77d6a22bd6370edf6a27aac2a879",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1192580,
            "upload_time": "2025-10-17T16:39:07",
            "upload_time_iso_8601": "2025-10-17T16:39:07.961378Z",
            "url": "https://files.pythonhosted.org/packages/d7/a9/93248c15823a8dde59760bb8e83fa69270a30cde2708dd6356deae4358d8/json_tools_rs-0.7.0-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "738af4f409d846ef6a3322e6d34de27d2a4da496f3e18f58d0ee2b086b9871d8",
                "md5": "a49307c23d1d8386d50bd4c29685cc7e",
                "sha256": "8d42e619c4da53f9994295cc77b33e5c14d56da0583809310b91440d2e803d57"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a49307c23d1d8386d50bd4c29685cc7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 926530,
            "upload_time": "2025-10-17T16:36:48",
            "upload_time_iso_8601": "2025-10-17T16:36:48.190502Z",
            "url": "https://files.pythonhosted.org/packages/73/8a/f4f409d846ef6a3322e6d34de27d2a4da496f3e18f58d0ee2b086b9871d8/json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "42069072ee9d6181b732195c38d9d6241ae7987c2c935ea2531738587d5e49dd",
                "md5": "24601e806f2d89f2aee7fe3542d37a27",
                "sha256": "c1a4894cf266d56d322b6bb5220ddecaf61b4fa2a4dbb0d3c90eef5627766161"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "24601e806f2d89f2aee7fe3542d37a27",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 918779,
            "upload_time": "2025-10-17T16:37:05",
            "upload_time_iso_8601": "2025-10-17T16:37:05.261650Z",
            "url": "https://files.pythonhosted.org/packages/42/06/9072ee9d6181b732195c38d9d6241ae7987c2c935ea2531738587d5e49dd/json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "581441a402efad0ebe48017a109c0cbcd9abda10e87cd3dcbf9989468f7d241b",
                "md5": "e243361837f4df0ad3ad1e78b93e23ff",
                "sha256": "a4adccf034c9dcae4ab0275888a1d9eeaec4b609dd7539b81f93772240dbf7b7"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "e243361837f4df0ad3ad1e78b93e23ff",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1048492,
            "upload_time": "2025-10-17T16:37:21",
            "upload_time_iso_8601": "2025-10-17T16:37:21.004611Z",
            "url": "https://files.pythonhosted.org/packages/58/14/41a402efad0ebe48017a109c0cbcd9abda10e87cd3dcbf9989468f7d241b/json_tools_rs-0.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cfcb8308eefbde94c06856b40e71c61455252ef3a0983fc1ce0d74d929b01943",
                "md5": "b71725e569bc176ea555f430cf4b1bde",
                "sha256": "6cc2b44d7d4ded139f0ff7b652749906202e15fdf4a28f8416aea314b852730c"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b71725e569bc176ea555f430cf4b1bde",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1108211,
            "upload_time": "2025-10-17T16:38:16",
            "upload_time_iso_8601": "2025-10-17T16:38:16.509487Z",
            "url": "https://files.pythonhosted.org/packages/cf/cb/8308eefbde94c06856b40e71c61455252ef3a0983fc1ce0d74d929b01943/json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9259492888b8717a818648b8f385aac4a136e6a185cf1a9bad988f968968d1a3",
                "md5": "716763a4ff182fbcc6af13d2cf84c88b",
                "sha256": "01c6e877e44ebbab6ed5bdf130ad60fcef65df368489516097ea9d65221df365"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "716763a4ff182fbcc6af13d2cf84c88b",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1184245,
            "upload_time": "2025-10-17T16:38:36",
            "upload_time_iso_8601": "2025-10-17T16:38:36.333710Z",
            "url": "https://files.pythonhosted.org/packages/92/59/492888b8717a818648b8f385aac4a136e6a185cf1a9bad988f968968d1a3/json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4e8b9f1a350ac2adeadfddc931411a8ba88340a9373b0422f77bfae04aa217b8",
                "md5": "58e43796ab8dc83edb348eeb8e03ecd2",
                "sha256": "cf08715106437502cf5022f229d796c37ab0b852ae19d23903c26303cba18ce9"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "58e43796ab8dc83edb348eeb8e03ecd2",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1165835,
            "upload_time": "2025-10-17T16:38:53",
            "upload_time_iso_8601": "2025-10-17T16:38:53.040627Z",
            "url": "https://files.pythonhosted.org/packages/4e/8b/9f1a350ac2adeadfddc931411a8ba88340a9373b0422f77bfae04aa217b8/json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fc4d79831c1b3b7c5dfecd4c75aae1e5a0a083510b42bd817fa4f914e0b80601",
                "md5": "df154c9e70e3c7983ed933bb2d715e5f",
                "sha256": "0fe4b2a1722c47ff7a6591ed543748b23aaa6d62a0228687a565f15af845b803"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "df154c9e70e3c7983ed933bb2d715e5f",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 1191888,
            "upload_time": "2025-10-17T16:39:09",
            "upload_time_iso_8601": "2025-10-17T16:39:09.552181Z",
            "url": "https://files.pythonhosted.org/packages/fc/4d/79831c1b3b7c5dfecd4c75aae1e5a0a083510b42bd817fa4f914e0b80601/json_tools_rs-0.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "acbf962f2f4fb3f1a70ca88d7f46326b78effbde5bedfa8b93604085295d8b63",
                "md5": "171a4fabcb5937d23a625a20cdaba712",
                "sha256": "dee1b80253a725ff15efae4a5192c3fc172291f83401728fd74f0593987bc853"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "171a4fabcb5937d23a625a20cdaba712",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 936645,
            "upload_time": "2025-10-17T16:39:25",
            "upload_time_iso_8601": "2025-10-17T16:39:25.935267Z",
            "url": "https://files.pythonhosted.org/packages/ac/bf/962f2f4fb3f1a70ca88d7f46326b78effbde5bedfa8b93604085295d8b63/json_tools_rs-0.7.0-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ee8aaefef9ce5d64d3485c9bf9dc4464852cfc328af7e385a625d401a0b88474",
                "md5": "0b0a1b008f2bb0042adbae03ec9e4053",
                "sha256": "06e2325155ecf97a68988486166b4be5356eed3c2e3189e15136f6edd0680330"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp314-cp314-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "0b0a1b008f2bb0042adbae03ec9e4053",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.8",
            "size": 875451,
            "upload_time": "2025-10-17T16:38:02",
            "upload_time_iso_8601": "2025-10-17T16:38:02.076290Z",
            "url": "https://files.pythonhosted.org/packages/ee/8a/aefef9ce5d64d3485c9bf9dc4464852cfc328af7e385a625d401a0b88474/json_tools_rs-0.7.0-cp314-cp314-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f2b7c4f88dd7459d9f09ef0bae76025b27a8c93413c3dd8d984c702f66f6a33c",
                "md5": "9d19d349e7563a4257e60d8ff18e0daf",
                "sha256": "2b2ee2bc6ddc798268c41f429cd15421cce7da323a4caa732e4f96a1545a0e97"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp314-cp314-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "9d19d349e7563a4257e60d8ff18e0daf",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.8",
            "size": 1010792,
            "upload_time": "2025-10-17T16:37:37",
            "upload_time_iso_8601": "2025-10-17T16:37:37.550748Z",
            "url": "https://files.pythonhosted.org/packages/f2/b7/c4f88dd7459d9f09ef0bae76025b27a8c93413c3dd8d984c702f66f6a33c/json_tools_rs-0.7.0-cp314-cp314-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "298fe0b322e1ed27c9766a1267219a0ed11b429e8b74c72edace93d8e7797de0",
                "md5": "b35c34c6d88ddf80eece45f6dece8843",
                "sha256": "4a70986ad3beab6c80bbd277062ec2c329092c8c1f6abebff81bb9b70695274f"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b35c34c6d88ddf80eece45f6dece8843",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.8",
            "size": 1009220,
            "upload_time": "2025-10-17T16:37:50",
            "upload_time_iso_8601": "2025-10-17T16:37:50.226898Z",
            "url": "https://files.pythonhosted.org/packages/29/8f/e0b322e1ed27c9766a1267219a0ed11b429e8b74c72edace93d8e7797de0/json_tools_rs-0.7.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "50a4bb09bfc630433c5906a4a34aa2ee3e9888c68132ec0fe5df9f71fb9df341",
                "md5": "6dd212078a3ab2fad42d2f8d6be226de",
                "sha256": "82f9b1790af072a61c5eda109e7a16490364c5d19bc10c79f922e7b84c7190c7"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "6dd212078a3ab2fad42d2f8d6be226de",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1012218,
            "upload_time": "2025-10-17T16:37:39",
            "upload_time_iso_8601": "2025-10-17T16:37:39.091311Z",
            "url": "https://files.pythonhosted.org/packages/50/a4/bb09bfc630433c5906a4a34aa2ee3e9888c68132ec0fe5df9f71fb9df341/json_tools_rs-0.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19499e9c7ec102097845c27bcf96b2b6c12a05945da4f972546f7cc21d63ad17",
                "md5": "247b89e10ca8e75067bc982a9669a21f",
                "sha256": "39975ae5d4a1b35da2ae79922842b6ed5f5d350e4a2f74cacdad3d37b00b64e1"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "247b89e10ca8e75067bc982a9669a21f",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 930058,
            "upload_time": "2025-10-17T16:36:49",
            "upload_time_iso_8601": "2025-10-17T16:36:49.927325Z",
            "url": "https://files.pythonhosted.org/packages/19/49/9e9c7ec102097845c27bcf96b2b6c12a05945da4f972546f7cc21d63ad17/json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f3c941e6245ce192114fef391cc0d9db8b6db1f7e3f8021f1ddac77c99ba4085",
                "md5": "29f6349bd4d4c052865a871444eb0029",
                "sha256": "d960fbf13fc62cd61d60eedd0abd06e4453239c806d5330ee767aa9b796977ff"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "29f6349bd4d4c052865a871444eb0029",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 922081,
            "upload_time": "2025-10-17T16:37:06",
            "upload_time_iso_8601": "2025-10-17T16:37:06.759682Z",
            "url": "https://files.pythonhosted.org/packages/f3/c9/41e6245ce192114fef391cc0d9db8b6db1f7e3f8021f1ddac77c99ba4085/json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b5b491d3ee041c798b465766d418d88311595426c780385640578d0fa495c283",
                "md5": "a8820707ae7ec5e040eed742a56fdc4a",
                "sha256": "da114b3ad57931111890adbb04a9c634eaba7e0af6bb121567f23e522ce414af"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "a8820707ae7ec5e040eed742a56fdc4a",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1052048,
            "upload_time": "2025-10-17T16:37:22",
            "upload_time_iso_8601": "2025-10-17T16:37:22.642429Z",
            "url": "https://files.pythonhosted.org/packages/b5/b4/91d3ee041c798b465766d418d88311595426c780385640578d0fa495c283/json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "850f437d00a65e6f7400f7b778deafa33dce2977f3d9256aa3b3db15c8e83fc4",
                "md5": "e66d291fe61eed0b6feca6328c6c93e5",
                "sha256": "9df2c6ee1f07a8c22c7ca7a793ce1bbcb55ec31967758faa370a088cdcb9e7f0"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e66d291fe61eed0b6feca6328c6c93e5",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1011774,
            "upload_time": "2025-10-17T16:37:52",
            "upload_time_iso_8601": "2025-10-17T16:37:52.071246Z",
            "url": "https://files.pythonhosted.org/packages/85/0f/437d00a65e6f7400f7b778deafa33dce2977f3d9256aa3b3db15c8e83fc4/json_tools_rs-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cb8b6fcedd5251c9deeb3bc9f7c4709d4512fa35003ad99dcc3d5a434fcf08c4",
                "md5": "6b7f1a699c30acc708f0a4e61cae0dee",
                "sha256": "ed5118526a217d5cf1c07c640e735065b10efd0e1719d29019fd70e561c23867"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "6b7f1a699c30acc708f0a4e61cae0dee",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1111017,
            "upload_time": "2025-10-17T16:38:18",
            "upload_time_iso_8601": "2025-10-17T16:38:18.164294Z",
            "url": "https://files.pythonhosted.org/packages/cb/8b/6fcedd5251c9deeb3bc9f7c4709d4512fa35003ad99dcc3d5a434fcf08c4/json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c6d45c2deb93d8968747d3a27300dcbf7e35061cb06f1e9dbee3a5a364e62d28",
                "md5": "4f26447ca848fc7834f6ca3f4225bd7b",
                "sha256": "fc48570972427ccc6e2262fa07598f6bbf25d62395aeb0818473c4fa196cda54"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "4f26447ca848fc7834f6ca3f4225bd7b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1187396,
            "upload_time": "2025-10-17T16:38:38",
            "upload_time_iso_8601": "2025-10-17T16:38:38.090915Z",
            "url": "https://files.pythonhosted.org/packages/c6/d4/5c2deb93d8968747d3a27300dcbf7e35061cb06f1e9dbee3a5a364e62d28/json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9050bc638f2dab43c577913348b02681a7f90272c59a98da16a7d1798d30cca4",
                "md5": "5bebda373c8c4dac92a884585486c066",
                "sha256": "a355868c755f922781d0bc725882ab7f250aa27ae61146fa5db6bbee70584e6a"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "5bebda373c8c4dac92a884585486c066",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1168560,
            "upload_time": "2025-10-17T16:38:55",
            "upload_time_iso_8601": "2025-10-17T16:38:55.019164Z",
            "url": "https://files.pythonhosted.org/packages/90/50/bc638f2dab43c577913348b02681a7f90272c59a98da16a7d1798d30cca4/json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "50e7e5d0a0d3203156003dce699580626502e01af8252168bdcdc9ce364a9386",
                "md5": "2bd8d60e1cf9d5e4b299cc0bc6264455",
                "sha256": "492be09f5f9fe2217b1d04374b0413d8a01c59b32fdad2039582f1e07c59f928"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2bd8d60e1cf9d5e4b299cc0bc6264455",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1193938,
            "upload_time": "2025-10-17T16:39:11",
            "upload_time_iso_8601": "2025-10-17T16:39:11.059627Z",
            "url": "https://files.pythonhosted.org/packages/50/e7/e5d0a0d3203156003dce699580626502e01af8252168bdcdc9ce364a9386/json_tools_rs-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "634881cf4b2631c092ecaa2f4c05e6a3d1e614105f65a037ad7cc8b3ebbe58fc",
                "md5": "b8eb3d8411f0c81e15045d7a94392eeb",
                "sha256": "e08827889f256fdb14d737fdd0c563245a6d324557895522ab309b00eb2d2d45"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "b8eb3d8411f0c81e15045d7a94392eeb",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1012569,
            "upload_time": "2025-10-17T16:37:40",
            "upload_time_iso_8601": "2025-10-17T16:37:40.957321Z",
            "url": "https://files.pythonhosted.org/packages/63/48/81cf4b2631c092ecaa2f4c05e6a3d1e614105f65a037ad7cc8b3ebbe58fc/json_tools_rs-0.7.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ef7dc9d9eeca9e18c97ac468215008d8e9f0c0eed4d701988c749aaac4fdc636",
                "md5": "3cfcac4cfe3849eb366664afe11e2a01",
                "sha256": "c374f65d0f03ace06aa24c9f4b112e6e4231a73928c59ce3e4521b3f7a874df2"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "3cfcac4cfe3849eb366664afe11e2a01",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 929940,
            "upload_time": "2025-10-17T16:36:51",
            "upload_time_iso_8601": "2025-10-17T16:36:51.505967Z",
            "url": "https://files.pythonhosted.org/packages/ef/7d/c9d9eeca9e18c97ac468215008d8e9f0c0eed4d701988c749aaac4fdc636/json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f93cdbf6abf606f34bae665e469d04ae035a63bc9e75668b3db279c8389bc0aa",
                "md5": "35be655daabf7af60989a331ded6901b",
                "sha256": "578672d503f08789a33c28b2d0755e735c191194ee050f0f786f73b1df5af201"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "35be655daabf7af60989a331ded6901b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 922700,
            "upload_time": "2025-10-17T16:37:08",
            "upload_time_iso_8601": "2025-10-17T16:37:08.517153Z",
            "url": "https://files.pythonhosted.org/packages/f9/3c/dbf6abf606f34bae665e469d04ae035a63bc9e75668b3db279c8389bc0aa/json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fcb1645de93fad5f123122d8dcab6341d714442b5cc1cdd3a0bbaac5e013e1ac",
                "md5": "2b040d86e975783ed48ca98aa5ec3b77",
                "sha256": "e86ab35f0fa749e0da433147390013e63beed18dd08ef3a49599659445a1f07f"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "2b040d86e975783ed48ca98aa5ec3b77",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1052198,
            "upload_time": "2025-10-17T16:37:24",
            "upload_time_iso_8601": "2025-10-17T16:37:24.142114Z",
            "url": "https://files.pythonhosted.org/packages/fc/b1/645de93fad5f123122d8dcab6341d714442b5cc1cdd3a0bbaac5e013e1ac/json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e32df34f6f307e6c0b65bbaa529eb70738d6c6ab65af2052411307beea3b19a3",
                "md5": "7a41260d2a4f754e7b9054562604f541",
                "sha256": "271dea000db83099aaddc8c3c6a4511b21bf7b3e24f65766e070228243ffd422"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7a41260d2a4f754e7b9054562604f541",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1011707,
            "upload_time": "2025-10-17T16:37:53",
            "upload_time_iso_8601": "2025-10-17T16:37:53.935222Z",
            "url": "https://files.pythonhosted.org/packages/e3/2d/f34f6f307e6c0b65bbaa529eb70738d6c6ab65af2052411307beea3b19a3/json_tools_rs-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3b6ea58cd2d107ea6b68ebe6438e56076e286fa16e89db723b9cbf179a2c7fb5",
                "md5": "f9fe0931931e4dc9e47c46ba6c3b8f07",
                "sha256": "8bc965f255a9aeec1b78e844b514e4cb0238a41f8b86cc6701c6821c11d8abcc"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f9fe0931931e4dc9e47c46ba6c3b8f07",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1111160,
            "upload_time": "2025-10-17T16:38:20",
            "upload_time_iso_8601": "2025-10-17T16:38:20.028991Z",
            "url": "https://files.pythonhosted.org/packages/3b/6e/a58cd2d107ea6b68ebe6438e56076e286fa16e89db723b9cbf179a2c7fb5/json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "765e1f792392b59f7e6a0e8837618db0f6c7f23251204c59a2871d746ee5f660",
                "md5": "c287f88c225466f8c6baf1278bfb3bfc",
                "sha256": "f2220836c520a98bcfde325d916dde02dc5fbd467201e680118194db1692face"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "c287f88c225466f8c6baf1278bfb3bfc",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1188096,
            "upload_time": "2025-10-17T16:38:39",
            "upload_time_iso_8601": "2025-10-17T16:38:39.914169Z",
            "url": "https://files.pythonhosted.org/packages/76/5e/1f792392b59f7e6a0e8837618db0f6c7f23251204c59a2871d746ee5f660/json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "89202b290912aa58ec6055f5cdfa5c88538403464f3af51b57a200fd5f89d0c4",
                "md5": "89196bb4084f0df27b2c8c39d7343156",
                "sha256": "3f4bbc852e0309015309c6a21267436c9fc52b12801389df5b393ac5459838c4"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "89196bb4084f0df27b2c8c39d7343156",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1168489,
            "upload_time": "2025-10-17T16:38:56",
            "upload_time_iso_8601": "2025-10-17T16:38:56.534257Z",
            "url": "https://files.pythonhosted.org/packages/89/20/2b290912aa58ec6055f5cdfa5c88538403464f3af51b57a200fd5f89d0c4/json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "76c90967c2dc7422a0568a538b111a4771793f7a23d4d9491b75b4ddd16e6333",
                "md5": "61f662c3e414ec05557eed10e5b919d2",
                "sha256": "5ab1b030ee2d3a74ed1d4e10fb7f15af637b9f074d2cd6162420fc6ffe59a7a0"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "61f662c3e414ec05557eed10e5b919d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1194086,
            "upload_time": "2025-10-17T16:39:12",
            "upload_time_iso_8601": "2025-10-17T16:39:12.627535Z",
            "url": "https://files.pythonhosted.org/packages/76/c9/0967c2dc7422a0568a538b111a4771793f7a23d4d9491b75b4ddd16e6333/json_tools_rs-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f4e06e1efca8d40f40ee1dd9584303151c379d9c1cd4a2147d84c263c5c2accc",
                "md5": "82745c650e8bf5e842e8345f868979c4",
                "sha256": "1c2f3554ebad05bdf445ab03da4a75308f47d9831a8ac3aae693fe4462b019b7"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "82745c650e8bf5e842e8345f868979c4",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 936665,
            "upload_time": "2025-10-17T16:39:27",
            "upload_time_iso_8601": "2025-10-17T16:39:27.476793Z",
            "url": "https://files.pythonhosted.org/packages/f4/e0/6e1efca8d40f40ee1dd9584303151c379d9c1cd4a2147d84c263c5c2accc/json_tools_rs-0.7.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dcf71d6006255ddecda570a6d6c072d1b75068b6d48edb304c477c60fa8985e6",
                "md5": "04a570eca40e15b09b8fdcda9ea5e6f1",
                "sha256": "382f7c650c7385c1e72b7c508cbc01c89ef221c801fdd571ce7e8cb70e1e2f79"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "04a570eca40e15b09b8fdcda9ea5e6f1",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 929749,
            "upload_time": "2025-10-17T16:36:53",
            "upload_time_iso_8601": "2025-10-17T16:36:53.162564Z",
            "url": "https://files.pythonhosted.org/packages/dc/f7/1d6006255ddecda570a6d6c072d1b75068b6d48edb304c477c60fa8985e6/json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3336592c80ca69a5c7c08b90141bdaabef549c1e5ecf6d9fce917ea70c873b77",
                "md5": "19d25b485aa626d8387e053401790c65",
                "sha256": "23b10114b72ebb833f0cd003ef14ac2e9e609ddd13885e350cbd9f9dc8b6ea1d"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "19d25b485aa626d8387e053401790c65",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 923125,
            "upload_time": "2025-10-17T16:37:10",
            "upload_time_iso_8601": "2025-10-17T16:37:10.159955Z",
            "url": "https://files.pythonhosted.org/packages/33/36/592c80ca69a5c7c08b90141bdaabef549c1e5ecf6d9fce917ea70c873b77/json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "827febec18000bd0925a2037aadfff89cb4d8c195df0db7ded88022810fe2568",
                "md5": "3694276a43e9e59f6dc7b6743749925e",
                "sha256": "4d53c9ecf0b38d3a53dcf66cc8fe383c972cb90089fdcc94614bd939930e5d02"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "3694276a43e9e59f6dc7b6743749925e",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 1051897,
            "upload_time": "2025-10-17T16:37:25",
            "upload_time_iso_8601": "2025-10-17T16:37:25.628726Z",
            "url": "https://files.pythonhosted.org/packages/82/7f/ebec18000bd0925a2037aadfff89cb4d8c195df0db7ded88022810fe2568/json_tools_rs-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "af48365ee9558df64b86324373b0ebc9f1f9a13d9a1aa18a4aa28ecc5164adbc",
                "md5": "717227167cd4dd04da7d3cad1b13e2a3",
                "sha256": "7c50e73ae37f427294c4a5bbee4e6ee0076fff37987c0ef092e1f02382a78760"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "717227167cd4dd04da7d3cad1b13e2a3",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 1110865,
            "upload_time": "2025-10-17T16:38:22",
            "upload_time_iso_8601": "2025-10-17T16:38:22.955339Z",
            "url": "https://files.pythonhosted.org/packages/af/48/365ee9558df64b86324373b0ebc9f1f9a13d9a1aa18a4aa28ecc5164adbc/json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "54ed2a34561d1650d19ec37588c1ed417cce224a7aaa5f8582beceaabbea556a",
                "md5": "8edf3f01898e6fd28cde151fe19f1503",
                "sha256": "cd0d1e9f63d05fbf662bb1dfc6db2b6981b414b14d852d7085f4b64308fd87e9"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "8edf3f01898e6fd28cde151fe19f1503",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 1188438,
            "upload_time": "2025-10-17T16:38:41",
            "upload_time_iso_8601": "2025-10-17T16:38:41.528875Z",
            "url": "https://files.pythonhosted.org/packages/54/ed/2a34561d1650d19ec37588c1ed417cce224a7aaa5f8582beceaabbea556a/json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "79bf19d8ad7792ea31ada77ba909322928f5f558bcc3cb0c2aa10430b64f8d34",
                "md5": "e429b02ad5f00e2192a882b2d9a50109",
                "sha256": "0504cdbb9497a93a499536fb0edfcbbe3d5cb76d89e21fd54dc24f8f9608940f"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "e429b02ad5f00e2192a882b2d9a50109",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 1168357,
            "upload_time": "2025-10-17T16:38:58",
            "upload_time_iso_8601": "2025-10-17T16:38:58.038972Z",
            "url": "https://files.pythonhosted.org/packages/79/bf/19d8ad7792ea31ada77ba909322928f5f558bcc3cb0c2aa10430b64f8d34/json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19a2871974be7a7c6dccf3a4500edfed7d79fad49211543847229238da3c1c99",
                "md5": "d853743af1c4cd5366980bb224f5775d",
                "sha256": "e3330668175e0fc4bbf4830ef946b4bde2896c0268f4dff14a0a684d80dde83a"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d853743af1c4cd5366980bb224f5775d",
            "packagetype": "bdist_wheel",
            "python_version": "pp310",
            "requires_python": ">=3.8",
            "size": 1194132,
            "upload_time": "2025-10-17T16:39:14",
            "upload_time_iso_8601": "2025-10-17T16:39:14.413380Z",
            "url": "https://files.pythonhosted.org/packages/19/a2/871974be7a7c6dccf3a4500edfed7d79fad49211543847229238da3c1c99/json_tools_rs-0.7.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a852e5dd9a81225dba3111bef841785712b1b700926ee9b834324e6359fa1b69",
                "md5": "b04ab056d0688d36cf12ad77a4062237",
                "sha256": "067e9946178a394782afc1e3f9a8bc62d41589beb65cf85ce5195b85ec9d0cbc"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "b04ab056d0688d36cf12ad77a4062237",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1012399,
            "upload_time": "2025-10-17T16:37:42",
            "upload_time_iso_8601": "2025-10-17T16:37:42.398326Z",
            "url": "https://files.pythonhosted.org/packages/a8/52/e5dd9a81225dba3111bef841785712b1b700926ee9b834324e6359fa1b69/json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "695d119c838096051ff6a0c6af1036861d93ce70019cef52479797a7ee459d76",
                "md5": "4cfd98c22560dcf6411f135f466a1cd9",
                "sha256": "5669935848b65f03a432be69a5e89421b5638b0eb3aac11a390e8c3eec4a2720"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "4cfd98c22560dcf6411f135f466a1cd9",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 929717,
            "upload_time": "2025-10-17T16:36:54",
            "upload_time_iso_8601": "2025-10-17T16:36:54.984965Z",
            "url": "https://files.pythonhosted.org/packages/69/5d/119c838096051ff6a0c6af1036861d93ce70019cef52479797a7ee459d76/json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2ed02307f264a69a24b8e71c7dbeaaeb9c4a2908e96e95e85f5d790eccec4713",
                "md5": "152ec54ebe207563409b4462ffb197a1",
                "sha256": "53a73787ce7442dd559aec3a23d11aa21182234fa8f1fe69285d66a08b8dbec8"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "152ec54ebe207563409b4462ffb197a1",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 922562,
            "upload_time": "2025-10-17T16:37:11",
            "upload_time_iso_8601": "2025-10-17T16:37:11.674264Z",
            "url": "https://files.pythonhosted.org/packages/2e/d0/2307f264a69a24b8e71c7dbeaaeb9c4a2908e96e95e85f5d790eccec4713/json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bca432c935285e4d64fd0a9e7c425f05ca4699436350557b27af515d03bc5bbe",
                "md5": "a0f982b9b0e0a99e676cdef2c340d407",
                "sha256": "feaa9ebe3baf41c4b59c506a829c36483b5749aa9cfd4ef0f466747871f73d95"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "a0f982b9b0e0a99e676cdef2c340d407",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1051997,
            "upload_time": "2025-10-17T16:37:27",
            "upload_time_iso_8601": "2025-10-17T16:37:27.143808Z",
            "url": "https://files.pythonhosted.org/packages/bc/a4/32c935285e4d64fd0a9e7c425f05ca4699436350557b27af515d03bc5bbe/json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b0a25c8bf42d98457833c76b61715add23c94a5d77560b5c90bdda3b2563d91d",
                "md5": "3d3b2ca2b40f09133d4f062e5dffbd6e",
                "sha256": "f954b68561650d25b8824627fc60c1c6a556336478d0cb0ac65d773b0859d04d"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3d3b2ca2b40f09133d4f062e5dffbd6e",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1011679,
            "upload_time": "2025-10-17T16:37:55",
            "upload_time_iso_8601": "2025-10-17T16:37:55.744567Z",
            "url": "https://files.pythonhosted.org/packages/b0/a2/5c8bf42d98457833c76b61715add23c94a5d77560b5c90bdda3b2563d91d/json_tools_rs-0.7.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5983235691eafbc1de23eca8d8d21b95fa9b3312b014b5db75fbf0dbe6520987",
                "md5": "74ae026338df588ccedbb792ad21c36a",
                "sha256": "a5c9626e229c9797df8893a34264a6644a5820e3022b89d22027c937a8b16f24"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "74ae026338df588ccedbb792ad21c36a",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1110889,
            "upload_time": "2025-10-17T16:38:24",
            "upload_time_iso_8601": "2025-10-17T16:38:24.558760Z",
            "url": "https://files.pythonhosted.org/packages/59/83/235691eafbc1de23eca8d8d21b95fa9b3312b014b5db75fbf0dbe6520987/json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a337a5d659a4812cb8919d938160213d43707c975e7729f0e8f923f0f30a974e",
                "md5": "e0170e6c0e04b535709c4e56551ffff6",
                "sha256": "b55dac37a0473728da82c844c6688e8364b6fa55572a5a5c8a2280c2ecc9527c"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "e0170e6c0e04b535709c4e56551ffff6",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1187902,
            "upload_time": "2025-10-17T16:38:43",
            "upload_time_iso_8601": "2025-10-17T16:38:43.063671Z",
            "url": "https://files.pythonhosted.org/packages/a3/37/a5d659a4812cb8919d938160213d43707c975e7729f0e8f923f0f30a974e/json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a4bce7c2a005af627ff633e7e02344c41e481341c3b3272c18b4294a99d34a22",
                "md5": "520e5ec6880f92234a9a7a514f624dd6",
                "sha256": "a0ee1202400039807c257f7da27d0a0d5dabd6438cce9add1aed00ad2d4f00b2"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "520e5ec6880f92234a9a7a514f624dd6",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1168459,
            "upload_time": "2025-10-17T16:38:59",
            "upload_time_iso_8601": "2025-10-17T16:38:59.666558Z",
            "url": "https://files.pythonhosted.org/packages/a4/bc/e7c2a005af627ff633e7e02344c41e481341c3b3272c18b4294a99d34a22/json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8691ca4a15f872a62158c1dc17c50a86efdfbd2fa4c4699192e166ab87383fd6",
                "md5": "686ac235b4afbd18b8eb00aa7218a93c",
                "sha256": "00eeba22766d60acd012cbc763d5245a0b8d1f773a4d0b8e571de97cf076ecd3"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "686ac235b4afbd18b8eb00aa7218a93c",
            "packagetype": "bdist_wheel",
            "python_version": "pp311",
            "requires_python": ">=3.8",
            "size": 1194082,
            "upload_time": "2025-10-17T16:39:15",
            "upload_time_iso_8601": "2025-10-17T16:39:15.931072Z",
            "url": "https://files.pythonhosted.org/packages/86/91/ca4a15f872a62158c1dc17c50a86efdfbd2fa4c4699192e166ab87383fd6/json_tools_rs-0.7.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ff34a4d7fa2f99f074afc47f821a3ad72931eafaa8f9bad31f8e0b500022f9cd",
                "md5": "0b217479df58be1ba6e954fb0f53bf16",
                "sha256": "6cca2616bb8c24762427673b4bd14e5e3125486629bfb71211330bd71cfb5e61"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "0b217479df58be1ba6e954fb0f53bf16",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 929666,
            "upload_time": "2025-10-17T16:36:56",
            "upload_time_iso_8601": "2025-10-17T16:36:56.801496Z",
            "url": "https://files.pythonhosted.org/packages/ff/34/a4d7fa2f99f074afc47f821a3ad72931eafaa8f9bad31f8e0b500022f9cd/json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1f200ecc330ae62ecddfb383114ce398bb597d0098870c4b9ac5921ca3a99263",
                "md5": "2c3fe867118141cc63e08d8140912171",
                "sha256": "1fc46d7155693a143d1a2f004e9f6d3df2f3db8f20e0080844cb37a744b2e38a"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "2c3fe867118141cc63e08d8140912171",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 923012,
            "upload_time": "2025-10-17T16:37:13",
            "upload_time_iso_8601": "2025-10-17T16:37:13.172728Z",
            "url": "https://files.pythonhosted.org/packages/1f/20/0ecc330ae62ecddfb383114ce398bb597d0098870c4b9ac5921ca3a99263/json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3384839457369ac8cfae17347cfbdad48d67cbdfcc3e27ea045f5416afa70beb",
                "md5": "8e93f70ecc6adbec998e21f26f0174b3",
                "sha256": "ab7e3d721862f58bdd577c07141299b19c1ed76eeb769e06220e65bede79b28c"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "8e93f70ecc6adbec998e21f26f0174b3",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 1052053,
            "upload_time": "2025-10-17T16:37:28",
            "upload_time_iso_8601": "2025-10-17T16:37:28.931694Z",
            "url": "https://files.pythonhosted.org/packages/33/84/839457369ac8cfae17347cfbdad48d67cbdfcc3e27ea045f5416afa70beb/json_tools_rs-0.7.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "afefb4c1e1d41ace7638762bb7bf49b63a0592faf24ec77a1b527a505d24146d",
                "md5": "65e984283a4b702da264862a75330f74",
                "sha256": "571eb9c7c2e11b68823e5f2ac26c9ba3b4cfea9ca77a7d6de3e876dfd3793ab2"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "65e984283a4b702da264862a75330f74",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 1110905,
            "upload_time": "2025-10-17T16:38:26",
            "upload_time_iso_8601": "2025-10-17T16:38:26.193138Z",
            "url": "https://files.pythonhosted.org/packages/af/ef/b4c1e1d41ace7638762bb7bf49b63a0592faf24ec77a1b527a505d24146d/json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6ddfa6841899f328b86ecfd1e03d3bf727b97809bac2560113adfe9a9335430a",
                "md5": "3473be5b76e445138f4e568794e2f475",
                "sha256": "807b55923e87826c1dde82932ce53b923a25196cca1e6f1c145d5a20c60c2ebc"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "3473be5b76e445138f4e568794e2f475",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 1188433,
            "upload_time": "2025-10-17T16:38:44",
            "upload_time_iso_8601": "2025-10-17T16:38:44.664916Z",
            "url": "https://files.pythonhosted.org/packages/6d/df/a6841899f328b86ecfd1e03d3bf727b97809bac2560113adfe9a9335430a/json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6065bc4477d2f88462815d4e277ae05196896df65fe7c51cd88d89a66d861b65",
                "md5": "1448d1751216252bec700c169e08d8a8",
                "sha256": "0caa5924bbe53a0b1a896ab65711422de5f54c60ce05e57499263fbccfb38844"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "1448d1751216252bec700c169e08d8a8",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 1168356,
            "upload_time": "2025-10-17T16:39:01",
            "upload_time_iso_8601": "2025-10-17T16:39:01.354952Z",
            "url": "https://files.pythonhosted.org/packages/60/65/bc4477d2f88462815d4e277ae05196896df65fe7c51cd88d89a66d861b65/json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e59e6a61768392fe7ebfb3227b9e4484f7b9f148774950275924b60277e87e19",
                "md5": "9f809733041754e102e967cc7f77e72c",
                "sha256": "59b20db0f86235c36c66bab49b180f76c8a06df849c3e032a2f9a598cd0cc424"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9f809733041754e102e967cc7f77e72c",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": ">=3.8",
            "size": 1193960,
            "upload_time": "2025-10-17T16:39:17",
            "upload_time_iso_8601": "2025-10-17T16:39:17.790977Z",
            "url": "https://files.pythonhosted.org/packages/e5/9e/6a61768392fe7ebfb3227b9e4484f7b9f148774950275924b60277e87e19/json_tools_rs-0.7.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0625241a9244a9a9cf7ca581d7e693f2b128c60a68c2c67757c079ecee134dc7",
                "md5": "570f3af8d6c8c78e5b30788699365c4f",
                "sha256": "c4cd09516c81ceed496640f0dee8062a7ba7ad724d53268182f62e16c8850ad3"
            },
            "downloads": -1,
            "filename": "json_tools_rs-0.7.0.tar.gz",
            "has_sig": false,
            "md5_digest": "570f3af8d6c8c78e5b30788699365c4f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 108147,
            "upload_time": "2025-10-17T16:39:19",
            "upload_time_iso_8601": "2025-10-17T16:39:19.301185Z",
            "url": "https://files.pythonhosted.org/packages/06/25/241a9244a9a9cf7ca581d7e693f2b128c60a68c2c67757c079ecee134dc7/json_tools_rs-0.7.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-17 16:39:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "amaye15",
    "github_project": "JSON-Tools-rs",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "json-tools-rs"
}
        
Elapsed time: 1.15590s