# 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.
[](https://crates.io/crates/json-tools-rs)
[](https://docs.rs/json-tools-rs)
[](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[](https://crates.io/crates/json-tools-rs)\n[](https://docs.rs/json-tools-rs)\n[](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"
}