# 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.
## Features
- **π Unified API**: Single `JSONTools` entry point for both flattening and unflattening operations
- **π§ Builder Pattern**: Fluent, chainable API for easy configuration and method chaining
- **β‘ High Performance**: SIMD-accelerated JSON parsing with FxHashMap optimization and reduced memory allocations
- **π― Complete Roundtrip Support**: Flatten JSON and unflatten it back to original structure with perfect fidelity
- **π§Ή Comprehensive Filtering**: Remove empty strings, nulls, empty objects, and empty arrays
- **π Advanced Replacements**: Support for literal and regex-based key/value replacements with collision handling
- **βοΈ Key Collision Handling**: Two strategies for handling key conflicts after transformations
- **Avoid Collisions**: Append index suffixes to make keys unique
- **Collect Values**: Merge colliding values into arrays with intelligent filtering
- **π¦ Batch Processing**: Handle single JSON strings or arrays of JSON strings efficiently
- **π Python Bindings**: Full Python support with perfect type matching (input type = output type)
- **π‘οΈ Type Safety**: Compile-time checked with comprehensive `JsonToolsError` enum and detailed error messages
- **π₯ Performance Optimizations**: FxHashMap for 15-30% faster operations, reduced string allocations, optimized SIMD parsing
## 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)?;
match result {
JsonOutput::Single(flattened) => println!("{}", flattened),
JsonOutput::Multiple(_) => unreachable!(),
}
// 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("regex:(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)?;
match result {
JsonOutput::Single(flattened) => println!("{}", flattened),
JsonOutput::Multiple(_) => unreachable!(),
}
// 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}}
```
#### 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,
JsonOutput::Multiple(_) => unreachable!(),
};
// Unflatten back to original structure
let restored = JSONTools::new().unflatten().execute(&flattened_str)?;
let restored_str = match restored {
JsonOutput::Single(s) => s,
JsonOutput::Multiple(_) => 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 means `str` input gives `str` output, `dict` input gives `dict` output, and lists preserve their element types.
#### Basic Usage
```python
import json_tools_rs
# Basic flattening - dict input β dict output
tools = json_tools_rs.JSONTools().flatten()
result = tools.execute({"user": {"name": "John", "age": 30}})
print(result) # {'user.name': 'John', 'user.age': 30} (dict)
# Basic flattening - JSON string input β JSON string output
result = tools.execute('{"user": {"name": "John", "age": 30}}')
print(result) # '{"user.name": "John", "user.age": 30}' (str)
# Basic unflattening - dict input β dict output
tools = json_tools_rs.JSONTools().unflatten()
result = tools.execute({"user.name": "John", "user.age": 30})
print(result) # {'user': {'name': 'John', 'age': 30}} (dict)
```
#### Advanced Configuration
```python
import json_tools_rs
# Advanced flattening with filtering and transformations
tools = (json_tools_rs.JSONTools()
.flatten()
.separator("::")
.lowercase_keys(True)
.remove_empty_strings(True)
.remove_nulls(True)
.remove_empty_objects(True)
.remove_empty_arrays(True)
.key_replacement("regex:(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'} (dict)
# Advanced unflattening with same configuration options
tools = (json_tools_rs.JSONTools()
.unflatten()
.separator("::")
.lowercase_keys(True)
.remove_empty_strings(True)
.remove_nulls(True)
.key_replacement("prefix_", "user_")
.value_replacement("@company.org", "@example.com"))
flattened = {"PREFIX_NAME": "john", "PREFIX_EMAIL": "john@company.org", "empty": ""}
result = tools.execute(flattened)
print(result) # {'user': {'name': 'john', 'email': 'john@example.com'}} (dict)
```
#### Batch Processing with Type Preservation
```python
import json_tools_rs
tools = json_tools_rs.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 of strings)
# 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}] (list of dicts)
# Mixed types are handled automatically
mixed_batch = ['{"a": 1}', {"b": {"c": 2}}]
results = tools.execute(mixed_batch)
print(results) # ['{"a": 1}', {'b.c': 2}] (preserves original types)
```
#### 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!
```
## Installation
### Rust
Add to your `Cargo.toml`:
```toml
[dependencies]
json-tools-rs = "0.2.0"
```
### Python
#### From PyPI (Recommended)
```bash
pip install json-tools-rs
```
#### Build from Source with Maturin
```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
```
## Performance
JSON Tools RS delivers exceptional performance through multiple optimizations:
### Performance Optimizations
- **π₯ FxHashMap**: 15-30% faster string key operations compared to standard HashMap
- **β‘ SIMD JSON Parsing**: Optimized `simd-json` for faster parsing and serialization
- **π§ Reduced Allocations**: ~50% fewer memory allocations through string reference optimization
- **π― Smart Capacity Management**: Pre-allocated HashMaps and string builders to eliminate rehashing
- **π String Pooling**: Thread-local string pools for memory reuse
### Benchmark Results
Performance varies by workload complexity, but typical results 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
### Running Benchmarks
```bash
# Run comprehensive benchmarks
cargo bench
# Run specific benchmark suites
cargo bench flatten
cargo bench unflatten
cargo bench roundtrip
```
## 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
- **`.unflatten()`** - Configure for unflattening operations
- **`.execute(input)`** - Execute the configured operation
#### Configuration Methods
All configuration methods are available for both flattening and unflattening operations:
- **`.separator(sep: &str)`** - Set separator for nested keys (default: ".")
- **`.lowercase_keys(value: bool)`** - Convert all keys to lowercase
- **`.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
- **`.key_replacement(find: &str, replace: &str)`** - Add key replacement pattern (supports regex with "regex:" prefix)
- **`.value_replacement(find: &str, replace: &str)`** - Add value replacement pattern (supports regex with "regex:" prefix)
#### Collision Handling Methods
- **`.handle_key_collision(value: bool)`** - Merge colliding values into arrays with intelligent filtering
- **`.avoid_key_collision(value: bool)`** - Append index suffixes to make keys unique
#### Input/Output Types
**Rust:**
- `&str` (JSON string) β `JsonOutput::Single(String)`
- `Vec<&str>` (JSON strings) β `JsonOutput::Multiple(Vec<String>)`
**Python:**
- `str` β `str` (JSON string)
- `dict` β `dict` (Python dictionary)
- `List[str]` β `List[str]` (list of JSON strings)
- `List[dict]` β `List[dict]` (list of Python dictionaries)
- Mixed lists preserve original types
### Error Handling
The library uses a comprehensive `JsonToolsError` enum that provides detailed error information and suggestions:
- **`JsonParseError`** - JSON parsing failures with syntax suggestions
- **`RegexError`** - Regex pattern compilation errors with pattern suggestions
- **`InvalidJsonStructure`** - Structure validation errors with format guidance
- **`ConfigurationError`** - API usage errors with correct usage examples
- **`BatchProcessingError`** - Batch operation errors with item-specific details
- **`SerializationError`** - JSON serialization failures with debugging information
Each error includes a helpful suggestion message to guide users toward the correct solution.
## Examples and Testing
### Running Examples
```bash
# Rust examples
cargo run --example basic_usage
# Python examples
python python/examples/basic_usage.py
python python/examples/examples.py
```
### Running Tests
```bash
# Run all Rust tests
cargo test
# Run tests with Python features
cargo test --features python
# Run Python tests (after building with maturin)
python -m pytest python/tests/
```
## 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
2. Install Rust (latest stable)
3. Install Python 3.8+ and maturin for Python bindings
4. Run tests to ensure everything works
## 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.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 strategies
- Python bindings with perfect type matching
- Performance optimizations (FxHashMap, SIMD parsing, reduced allocations)
- 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": null,
"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## Features\n\n- **\ud83d\ude80 Unified API**: Single `JSONTools` entry point for both flattening and unflattening operations\n- **\ud83d\udd27 Builder Pattern**: Fluent, chainable API for easy configuration and method chaining\n- **\u26a1 High Performance**: SIMD-accelerated JSON parsing with FxHashMap optimization and reduced memory allocations\n- **\ud83c\udfaf Complete Roundtrip Support**: Flatten JSON and unflatten it back to original structure with perfect fidelity\n- **\ud83e\uddf9 Comprehensive Filtering**: Remove empty strings, nulls, empty objects, and empty arrays\n- **\ud83d\udd04 Advanced Replacements**: Support for literal and regex-based key/value replacements with collision handling\n- **\u2694\ufe0f Key Collision Handling**: Two strategies for handling key conflicts after transformations\n - **Avoid Collisions**: Append index suffixes to make keys unique\n - **Collect Values**: Merge colliding values into arrays with intelligent filtering\n- **\ud83d\udce6 Batch Processing**: Handle single JSON strings or arrays of JSON strings efficiently\n- **\ud83d\udc0d Python Bindings**: Full Python support with perfect type matching (input type = output type)\n- **\ud83d\udee1\ufe0f Type Safety**: Compile-time checked with comprehensive `JsonToolsError` enum and detailed error messages\n- **\ud83d\udd25 Performance Optimizations**: FxHashMap for 15-30% faster operations, reduced string allocations, optimized SIMD parsing\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\nmatch result {\n JsonOutput::Single(flattened) => println!(\"{}\", flattened),\n JsonOutput::Multiple(_) => unreachable!(),\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(\"regex:(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\nmatch result {\n JsonOutput::Single(flattened) => println!(\"{}\", flattened),\n JsonOutput::Multiple(_) => unreachable!(),\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#### 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 {\n JsonOutput::Single(s) => s,\n JsonOutput::Multiple(_) => unreachable!(),\n};\n\n// Unflatten back to original structure\nlet restored = JSONTools::new().unflatten().execute(&flattened_str)?;\nlet restored_str = match restored {\n JsonOutput::Single(s) => s,\n JsonOutput::Multiple(_) => unreachable!(),\n};\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 means `str` input gives `str` output, `dict` input gives `dict` output, and lists preserve their element types.\n\n#### Basic Usage\n\n```python\nimport json_tools_rs\n\n# Basic flattening - dict input \u2192 dict output\ntools = json_tools_rs.JSONTools().flatten()\nresult = tools.execute({\"user\": {\"name\": \"John\", \"age\": 30}})\nprint(result) # {'user.name': 'John', 'user.age': 30} (dict)\n\n# Basic flattening - JSON string input \u2192 JSON string output\nresult = tools.execute('{\"user\": {\"name\": \"John\", \"age\": 30}}')\nprint(result) # '{\"user.name\": \"John\", \"user.age\": 30}' (str)\n\n# Basic unflattening - dict input \u2192 dict output\ntools = json_tools_rs.JSONTools().unflatten()\nresult = tools.execute({\"user.name\": \"John\", \"user.age\": 30})\nprint(result) # {'user': {'name': 'John', 'age': 30}} (dict)\n```\n\n#### Advanced Configuration\n\n```python\nimport json_tools_rs\n\n# Advanced flattening with filtering and transformations\ntools = (json_tools_rs.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(\"regex:(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'} (dict)\n\n# Advanced unflattening with same configuration options\ntools = (json_tools_rs.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\nflattened = {\"PREFIX_NAME\": \"john\", \"PREFIX_EMAIL\": \"john@company.org\", \"empty\": \"\"}\nresult = tools.execute(flattened)\nprint(result) # {'user': {'name': 'john', 'email': 'john@example.com'}} (dict)\n```\n\n#### Batch Processing with Type Preservation\n\n```python\nimport json_tools_rs\n\ntools = json_tools_rs.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}'] (list of strings)\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}] (list of dicts)\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}] (preserves original types)\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## Installation\n\n### Rust\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\njson-tools-rs = \"0.2.0\"\n```\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\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\n```\n\n## Performance\n\nJSON Tools RS delivers exceptional performance through multiple optimizations:\n\n### Performance Optimizations\n\n- **\ud83d\udd25 FxHashMap**: 15-30% faster string key operations compared to standard HashMap\n- **\u26a1 SIMD JSON Parsing**: Optimized `simd-json` for faster parsing and serialization\n- **\ud83e\udde0 Reduced Allocations**: ~50% fewer memory allocations through string reference optimization\n- **\ud83c\udfaf Smart Capacity Management**: Pre-allocated HashMaps and string builders to eliminate rehashing\n- **\ud83d\udd04 String Pooling**: Thread-local string pools for memory reuse\n\n### Benchmark Results\n\nPerformance varies by workload complexity, but typical results 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### 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\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\n- **`.unflatten()`** - Configure for unflattening operations\n- **`.execute(input)`** - Execute the configured operation\n\n#### Configuration Methods\n\nAll configuration methods are available for both flattening and unflattening operations:\n\n- **`.separator(sep: &str)`** - Set separator for nested keys (default: \".\")\n- **`.lowercase_keys(value: bool)`** - Convert all keys to lowercase\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- **`.key_replacement(find: &str, replace: &str)`** - Add key replacement pattern (supports regex with \"regex:\" prefix)\n- **`.value_replacement(find: &str, replace: &str)`** - Add value replacement pattern (supports regex with \"regex:\" prefix)\n\n#### Collision Handling Methods\n\n- **`.handle_key_collision(value: bool)`** - Merge colliding values into arrays with intelligent filtering\n- **`.avoid_key_collision(value: bool)`** - Append index suffixes to make keys unique\n\n#### Input/Output Types\n\n**Rust:**\n- `&str` (JSON string) \u2192 `JsonOutput::Single(String)`\n- `Vec<&str>` (JSON strings) \u2192 `JsonOutput::Multiple(Vec<String>)`\n\n**Python:**\n- `str` \u2192 `str` (JSON string)\n- `dict` \u2192 `dict` (Python dictionary)\n- `List[str]` \u2192 `List[str]` (list of JSON strings)\n- `List[dict]` \u2192 `List[dict]` (list of Python dictionaries)\n- Mixed lists preserve original types\n\n### Error Handling\n\nThe library uses a comprehensive `JsonToolsError` enum that provides detailed error information and suggestions:\n\n- **`JsonParseError`** - JSON parsing failures with syntax suggestions\n- **`RegexError`** - Regex pattern compilation errors with pattern suggestions\n- **`InvalidJsonStructure`** - Structure validation errors with format guidance\n- **`ConfigurationError`** - API usage errors with correct usage examples\n- **`BatchProcessingError`** - Batch operation errors with item-specific details\n- **`SerializationError`** - JSON serialization failures with debugging information\n\nEach error includes a helpful suggestion message to guide users toward the correct solution.\n\n## Examples and Testing\n\n### Running Examples\n\n```bash\n# Rust examples\ncargo run --example basic_usage\n\n# Python examples\npython python/examples/basic_usage.py\npython python/examples/examples.py\n```\n\n### Running Tests\n\n```bash\n# Run all Rust tests\ncargo test\n\n# Run tests with Python features\ncargo test --features python\n\n# Run Python tests (after building with maturin)\npython -m pytest python/tests/\n```\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\n2. Install Rust (latest stable)\n3. Install Python 3.8+ and maturin for Python bindings\n4. Run tests to ensure everything works\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.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 strategies\n- Python bindings with perfect type matching\n- Performance optimizations (FxHashMap, SIMD parsing, reduced allocations)\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",
"version": "0.2.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": "86eb57dfa3215a3e40ea23ab83e61ae35a026c31ab845d5eb7cf8c1d20098b2b",
"md5": "c2eaab79d7df9abeed97f0a3a9902530",
"sha256": "fada6a6383ec48a98a00a6ba9fde702b2fd579beaa204a912758f4af689b7325"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "c2eaab79d7df9abeed97f0a3a9902530",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 931611,
"upload_time": "2025-08-06T08:21:39",
"upload_time_iso_8601": "2025-08-06T08:21:39.940498Z",
"url": "https://files.pythonhosted.org/packages/86/eb/57dfa3215a3e40ea23ab83e61ae35a026c31ab845d5eb7cf8c1d20098b2b/json_tools_rs-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b1dc1060e4b70d07e167b16278df9a9c856abb58c6dbca8a9d965c000a813376",
"md5": "c60da321ff47f7c744a3832441a2cf28",
"sha256": "7e33a7961d23a0391c9c5d17a2882c84559fb30648932ffa7f6575ebb4654e52"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "c60da321ff47f7c744a3832441a2cf28",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 862687,
"upload_time": "2025-08-06T08:21:41",
"upload_time_iso_8601": "2025-08-06T08:21:41.978549Z",
"url": "https://files.pythonhosted.org/packages/b1/dc/1060e4b70d07e167b16278df9a9c856abb58c6dbca8a9d965c000a813376/json_tools_rs-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ed11185a14d0eb7dd0d39bfdeaf56dfa5a8a773826c21d93f3bee370a17e5924",
"md5": "2df21fcb066a5f3ac1cfc18cf627419b",
"sha256": "dd5d50fb9079517d9a81ee16364b2c6210ff6821f05483a5ca3259d3d53bb0e6"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "2df21fcb066a5f3ac1cfc18cf627419b",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 919406,
"upload_time": "2025-08-06T08:21:44",
"upload_time_iso_8601": "2025-08-06T08:21:44.775591Z",
"url": "https://files.pythonhosted.org/packages/ed/11/185a14d0eb7dd0d39bfdeaf56dfa5a8a773826c21d93f3bee370a17e5924/json_tools_rs-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dec8549ec9dd458c760c7202ebedf1df40a12af3eb235caeb1a90d0970cf032a",
"md5": "f43be299afb70c8cc4ccb3dee91cb9df",
"sha256": "adf5bde5bebadebd42b0f75cf5719f80796f0d475c0bd756d4cce2a45655f61a"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f43be299afb70c8cc4ccb3dee91cb9df",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1017113,
"upload_time": "2025-08-06T08:21:46",
"upload_time_iso_8601": "2025-08-06T08:21:46.417436Z",
"url": "https://files.pythonhosted.org/packages/de/c8/549ec9dd458c760c7202ebedf1df40a12af3eb235caeb1a90d0970cf032a/json_tools_rs-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5a13ccb17aafb7e7457b8e041d48e1f0eb5a9413afa8daa2d8f9d244f4e0abf9",
"md5": "b87cf9fa2bc5f77a39397e12c1813daa",
"sha256": "706f233853c683b8da3a6489f6b4143b3a10432169c02b5ac28f31d34e7171e6"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "b87cf9fa2bc5f77a39397e12c1813daa",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 886774,
"upload_time": "2025-08-06T08:21:48",
"upload_time_iso_8601": "2025-08-06T08:21:48.232054Z",
"url": "https://files.pythonhosted.org/packages/5a/13/ccb17aafb7e7457b8e041d48e1f0eb5a9413afa8daa2d8f9d244f4e0abf9/json_tools_rs-0.2.0-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4efd05c3eb71eef45f9db135687037c2dd315117ca6a48c38fcd9f67085d27c8",
"md5": "7f93803488aa11690d4a12e1bbc35959",
"sha256": "895a469f294a4d385d5e2ff5e98c4e4596bfa3a73f09feee6c9a495791c77bac"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "7f93803488aa11690d4a12e1bbc35959",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 931988,
"upload_time": "2025-08-06T08:21:50",
"upload_time_iso_8601": "2025-08-06T08:21:50.109824Z",
"url": "https://files.pythonhosted.org/packages/4e/fd/05c3eb71eef45f9db135687037c2dd315117ca6a48c38fcd9f67085d27c8/json_tools_rs-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "110fb8a5428a7aeb19df6dfbe2447025fd0b7bafcfbbe87105b56833c728290b",
"md5": "8522a9ceff49ad549808c422182a1e84",
"sha256": "72f2135bbfbcc658f266429aafc32bf4c3192e3485a57d5e258ab84945df7fb9"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "8522a9ceff49ad549808c422182a1e84",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 862887,
"upload_time": "2025-08-06T08:21:51",
"upload_time_iso_8601": "2025-08-06T08:21:51.941034Z",
"url": "https://files.pythonhosted.org/packages/11/0f/b8a5428a7aeb19df6dfbe2447025fd0b7bafcfbbe87105b56833c728290b/json_tools_rs-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d9e3ca8516f58c5bb24e1151cf67518758504a65faadbc2f8708a5f81c3a6ec4",
"md5": "ae46c7165131664ee0f16d7656ec408c",
"sha256": "fcf9c10dc4816a9ef214d49c0f55a3cc697f9e1ad193b6879c66c59bc340fe51"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "ae46c7165131664ee0f16d7656ec408c",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 919567,
"upload_time": "2025-08-06T08:21:53",
"upload_time_iso_8601": "2025-08-06T08:21:53.482724Z",
"url": "https://files.pythonhosted.org/packages/d9/e3/ca8516f58c5bb24e1151cf67518758504a65faadbc2f8708a5f81c3a6ec4/json_tools_rs-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "452ca2b5c7256a43251083b58905c74bae51b1de36d859bc33fb17b0140466dd",
"md5": "ec24b47661d08fb4e7dbd61db4133284",
"sha256": "1e8cfdca7f0014bd3096bec6f8a95006c8e0b813d9b39e103f1a9ecd94a5988c"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ec24b47661d08fb4e7dbd61db4133284",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1017196,
"upload_time": "2025-08-06T08:21:55",
"upload_time_iso_8601": "2025-08-06T08:21:55.993059Z",
"url": "https://files.pythonhosted.org/packages/45/2c/a2b5c7256a43251083b58905c74bae51b1de36d859bc33fb17b0140466dd/json_tools_rs-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "aa4673ea0bb4fead676267dafc2462cb36f97f2f768e242d9cde0d84ceded191",
"md5": "53660709896754053b89fff6352bbe90",
"sha256": "3749b02e538cdedfb406ac819d2f784a06cfeeeb9ee5bf9a7cd0e6b00dafc047"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "53660709896754053b89fff6352bbe90",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 886546,
"upload_time": "2025-08-06T08:21:57",
"upload_time_iso_8601": "2025-08-06T08:21:57.771285Z",
"url": "https://files.pythonhosted.org/packages/aa/46/73ea0bb4fead676267dafc2462cb36f97f2f768e242d9cde0d84ceded191/json_tools_rs-0.2.0-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7baea508fab9f5d45dde7bb9b59444cf4a1464349d3218a599a0cfb069c082b1",
"md5": "5bb1e308e1066ffd014349d1e302f22e",
"sha256": "c850a5eb9b93c087915b1bb4e2169b6efc31491ae179332e657bce9483c5b873"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "5bb1e308e1066ffd014349d1e302f22e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 929922,
"upload_time": "2025-08-06T08:21:59",
"upload_time_iso_8601": "2025-08-06T08:21:59.337870Z",
"url": "https://files.pythonhosted.org/packages/7b/ae/a508fab9f5d45dde7bb9b59444cf4a1464349d3218a599a0cfb069c082b1/json_tools_rs-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8d832da2d0000291eb7554e0c91bcdcaa7decd8efb218a8e5dcaebe7b58db2bc",
"md5": "ec113b51801c0c867eb7663e9d42fae6",
"sha256": "2cda4ae95cdb0119ba5aa4b063c8b02e9bd061bdd4376b5bfdada053615b3aec"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "ec113b51801c0c867eb7663e9d42fae6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 861328,
"upload_time": "2025-08-06T08:22:00",
"upload_time_iso_8601": "2025-08-06T08:22:00.888155Z",
"url": "https://files.pythonhosted.org/packages/8d/83/2da2d0000291eb7554e0c91bcdcaa7decd8efb218a8e5dcaebe7b58db2bc/json_tools_rs-0.2.0-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee048449355553372557b28acc3ecd28603743d8ce08835cf761f4562e177c0f",
"md5": "3f2bf031523d1ec0390e47e87f9a4d7e",
"sha256": "3c4935dd85f4c30aa25fb9b63cd31a590d1a26452bc19427cd24142732a6110a"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3f2bf031523d1ec0390e47e87f9a4d7e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 918543,
"upload_time": "2025-08-06T08:22:02",
"upload_time_iso_8601": "2025-08-06T08:22:02.754861Z",
"url": "https://files.pythonhosted.org/packages/ee/04/8449355553372557b28acc3ecd28603743d8ce08835cf761f4562e177c0f/json_tools_rs-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "95e9e865445a6e14853d26cff80d061f4e4a410887036f1741ad63a6e1aeccd6",
"md5": "6faadcf0651396fea9bb47c359ae9022",
"sha256": "c87569f7d13a705a2b31ae8c55af30a2b6a8ea079d49f4d2b723d448c7c02e46"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "6faadcf0651396fea9bb47c359ae9022",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1016636,
"upload_time": "2025-08-06T08:22:04",
"upload_time_iso_8601": "2025-08-06T08:22:04.848413Z",
"url": "https://files.pythonhosted.org/packages/95/e9/e865445a6e14853d26cff80d061f4e4a410887036f1741ad63a6e1aeccd6/json_tools_rs-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "17188ade46d3e9c155aa800835d34a2a1d6ead09a750ea0c89a8989e6fa263d3",
"md5": "edeb8e92db6094e6823ddf1834a3eff1",
"sha256": "a9d3cb90164f2b1aa3bc72a6b73af05b3c451dd67096761927fb20c654a2bbc9"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "edeb8e92db6094e6823ddf1834a3eff1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 886313,
"upload_time": "2025-08-06T08:22:06",
"upload_time_iso_8601": "2025-08-06T08:22:06.624275Z",
"url": "https://files.pythonhosted.org/packages/17/18/8ade46d3e9c155aa800835d34a2a1d6ead09a750ea0c89a8989e6fa263d3/json_tools_rs-0.2.0-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a0b50de195eae3656476d6dc3992e936a89b3eacb1dcb5fce308b750655e2a41",
"md5": "dcc2025cc2a4c70af6322354caf490ba",
"sha256": "5fab54ae153214e8fdfe0aacb870727afc925e114d53cf96fc5ebd3ee6b5d601"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "dcc2025cc2a4c70af6322354caf490ba",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 929581,
"upload_time": "2025-08-06T08:22:08",
"upload_time_iso_8601": "2025-08-06T08:22:08.226631Z",
"url": "https://files.pythonhosted.org/packages/a0/b5/0de195eae3656476d6dc3992e936a89b3eacb1dcb5fce308b750655e2a41/json_tools_rs-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "09446f461e32fc9433e754041d62bc92b82ebab552a27251782623828e92d547",
"md5": "bed23862db60d46f60ffa6ba77aa2b7c",
"sha256": "2470110dc1bc24e2394c4effe69f100f9e804bfbc96cc335fc9de64743df5dd0"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "bed23862db60d46f60ffa6ba77aa2b7c",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 861141,
"upload_time": "2025-08-06T08:22:09",
"upload_time_iso_8601": "2025-08-06T08:22:09.999516Z",
"url": "https://files.pythonhosted.org/packages/09/44/6f461e32fc9433e754041d62bc92b82ebab552a27251782623828e92d547/json_tools_rs-0.2.0-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e2bf63a2e95e20dfebaf08c36057b1d82c91b35ba1d4dcf5156986f87bd95cb1",
"md5": "bba8d08c2585e66dfe479993669e63bf",
"sha256": "8bd31e7a30b9fc41c6def1b8aaeea194194869a0dfa4f62b2316310cb81501c1"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "bba8d08c2585e66dfe479993669e63bf",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 917998,
"upload_time": "2025-08-06T08:22:11",
"upload_time_iso_8601": "2025-08-06T08:22:11.543736Z",
"url": "https://files.pythonhosted.org/packages/e2/bf/63a2e95e20dfebaf08c36057b1d82c91b35ba1d4dcf5156986f87bd95cb1/json_tools_rs-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "04b9aed8a5196f15c2db7581ef0a97f111ecf0b995ce62d60f0afc113566e4b6",
"md5": "a6481bf90eac14b7eb374245423d331d",
"sha256": "262f7874b45cc03bec24c40628957aa4d120aa7d8d873eb819f606127deb7b80"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a6481bf90eac14b7eb374245423d331d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1016113,
"upload_time": "2025-08-06T08:22:13",
"upload_time_iso_8601": "2025-08-06T08:22:13.286839Z",
"url": "https://files.pythonhosted.org/packages/04/b9/aed8a5196f15c2db7581ef0a97f111ecf0b995ce62d60f0afc113566e4b6/json_tools_rs-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7ab35c96069a0397bcd816ae496b8cc24a7b40df8098af789c160e7f1f7fc92f",
"md5": "26288aef0f2451ab644bdb66aa65d4eb",
"sha256": "d9521264a6a84ae15b5250d73a9e38ffef0f2ac8b849551714bca5473dd04dff"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "26288aef0f2451ab644bdb66aa65d4eb",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 885803,
"upload_time": "2025-08-06T08:22:15",
"upload_time_iso_8601": "2025-08-06T08:22:15.044656Z",
"url": "https://files.pythonhosted.org/packages/7a/b3/5c96069a0397bcd816ae496b8cc24a7b40df8098af789c160e7f1f7fc92f/json_tools_rs-0.2.0-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "66b2aa9b1c2a36b7f0154eff999a22327c31af49fc2d148c60b403653425bcc6",
"md5": "1f621bc3cd39431e48aaeead6ceb7256",
"sha256": "600bb66bff83f539bf18e0f3feaa52a65a6cf6bd9047b018e7c42b5d0e81e0c9"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp39-cp39-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "1f621bc3cd39431e48aaeead6ceb7256",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 931710,
"upload_time": "2025-08-06T08:22:16",
"upload_time_iso_8601": "2025-08-06T08:22:16.555478Z",
"url": "https://files.pythonhosted.org/packages/66/b2/aa9b1c2a36b7f0154eff999a22327c31af49fc2d148c60b403653425bcc6/json_tools_rs-0.2.0-cp39-cp39-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ced968213fc54f9bbaf28a59326fb1c2b9b9cb2c4ac15dbee5cea49427ceb41a",
"md5": "6ac1fd743658700c294b76a466c67ed1",
"sha256": "66463be3f68d6c4d0e2f274f824510ae9344d06199bb1abddf1380a3720bc514"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "6ac1fd743658700c294b76a466c67ed1",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 862811,
"upload_time": "2025-08-06T08:22:18",
"upload_time_iso_8601": "2025-08-06T08:22:18.213277Z",
"url": "https://files.pythonhosted.org/packages/ce/d9/68213fc54f9bbaf28a59326fb1c2b9b9cb2c4ac15dbee5cea49427ceb41a/json_tools_rs-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cfdeb0d254b431a052c746d52bf5e5faccb18b55ddc21ce9fff4153eb112999a",
"md5": "4838eb1d2729a6fd527b0b0437a9528c",
"sha256": "51a07cd99edcc9d770834d7d8ccac217a83f530d54f2f31b0f997ef1d1dcaa9f"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "4838eb1d2729a6fd527b0b0437a9528c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 919352,
"upload_time": "2025-08-06T08:22:19",
"upload_time_iso_8601": "2025-08-06T08:22:19.766842Z",
"url": "https://files.pythonhosted.org/packages/cf/de/b0d254b431a052c746d52bf5e5faccb18b55ddc21ce9fff4153eb112999a/json_tools_rs-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c698c1d6f2eddd70fb86eb5632cf86d78f611325c7227b3090ea27b2e93736a8",
"md5": "2322257839246471797ebf75c481415f",
"sha256": "293e909bb805127847b50bc78d67ef69f61ea02985431395efcda863953e8e41"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "2322257839246471797ebf75c481415f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1017097,
"upload_time": "2025-08-06T08:22:21",
"upload_time_iso_8601": "2025-08-06T08:22:21.317237Z",
"url": "https://files.pythonhosted.org/packages/c6/98/c1d6f2eddd70fb86eb5632cf86d78f611325c7227b3090ea27b2e93736a8/json_tools_rs-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "871da393952be63a877a9281ff5b2111c12648254fe73826fdc23a03511c80e9",
"md5": "dafb4857a6a6b25e19c0064b5e550657",
"sha256": "4e12fd4726c2a8442fc03cd046b0d7da325f4f4d5da1e08f2b84c11f7cf71e54"
},
"downloads": -1,
"filename": "json_tools_rs-0.2.0-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "dafb4857a6a6b25e19c0064b5e550657",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 886823,
"upload_time": "2025-08-06T08:22:22",
"upload_time_iso_8601": "2025-08-06T08:22:22.808887Z",
"url": "https://files.pythonhosted.org/packages/87/1d/a393952be63a877a9281ff5b2111c12648254fe73826fdc23a03511c80e9/json_tools_rs-0.2.0-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-06 08:21:39",
"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"
}