json-tools-rs


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

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

## 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"
}
        
Elapsed time: 1.06206s