fuzzy-json-repair


Namefuzzy-json-repair JSON
Version 0.1.4 PyPI version JSON
download
home_pageNone
SummaryFix typos in JSON keys using fuzzy matching with RapidFuzz
upload_time2025-10-26 11:16:17
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords json repair fuzzy matching typo pydantic validation llm
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Fuzzy JSON Repair

[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

You ask an LLM for JSON, it gives you `{"nam": "John", "emal": "john@example.com"}` instead of `{"name": "John", "email": "john@example.com"}`. Your Pydantic validation fails. You spend an hour writing error handling code.

This library fixes those typos automatically using fuzzy string matching. No more manual key mapping, no more try-except blocks everywhere.

## Install

```bash
pip install fuzzy-json-repair
```

If you're processing lots of data, install with numpy for ~10x faster batch processing:

```bash
pip install fuzzy-json-repair[fast]
```

## Usage

The simplest way - repair and validate in one go:

```python
from pydantic import BaseModel
from fuzzy_json_repair import fuzzy_model_validate_json

class User(BaseModel):
    name: str
    age: int
    email: str

# Your LLM gave you this
json_str = '{"nam": "John", "agge": 30, "emal": "john@example.com"}'

# This just works
user = fuzzy_model_validate_json(json_str, User)
print(user)  # User(name='John', age=30, email='john@example.com')
```

Or if you want more control:

```python
from fuzzy_json_repair import repair_keys

schema = User.model_json_schema()
data = {'nam': 'John', 'agge': 30, 'emal': 'john@example.com'}

result = repair_keys(data, schema)

if result.success:
    user = User.model_validate(result.data)
else:
    print(f"Repair failed: {len(result.errors)} errors")
    print(f"Error ratio: {result.error_ratio:.2%}")
```

## Advanced Usage

### Nested Objects

```python
class Address(BaseModel):
    street: str
    city: str
    zip_code: str

class Person(BaseModel):
    name: str
    address: Address

data = {
    'nam': 'John',
    'addres': {
        'stret': '123 Main St',
        'cty': 'NYC',
        'zip_cod': '10001'
    }
}

schema = Person.model_json_schema()
result = repair_keys(data, schema, max_error_ratio_per_key=0.5)

# All nested typos are fixed!
if result.success:
    person = Person.model_validate(result.data)
```

### Lists of Objects

```python
class Product(BaseModel):
    product_id: str
    name: str
    price: float

class Cart(BaseModel):
    cart_id: str
    products: list[Product]

data = {
    'cart_idd': 'C123',
    'prodcts': [
        {'product_idd': 'P1', 'nam': 'Laptop', 'pric': 999.99},
        {'product_idd': 'P2', 'nam': 'Mouse', 'pric': 29.99}
    ]
}

schema = Cart.model_json_schema()
result = repair_keys(data, schema, max_error_ratio_per_key=0.5)

# Repairs all typos in the list items too!
if result.success:
    cart = Cart.model_validate(result.data)
```

### Drop Unrepairable Items

Sometimes list items are beyond repair. Drop them automatically while respecting `minItems` constraints:

```python
class Product(BaseModel):
    name: str
    price: float

class Cart(BaseModel):
    items: list[Product]

data = {
    'items': [
        {'nam': 'Laptop', 'pric': 999},        # Repairable
        {'completely': 'wrong', 'keys': 123},  # Beyond repair
        {'nme': 'Mouse', 'prce': 29}           # Repairable
    ]
}

schema = Cart.model_json_schema()
result = repair_keys(
    data, schema,
    drop_unrepairable_items=True  # Drop items that can't be fixed
)

if result.success:
    # Returns 2 items (dropped the broken one)
    print(len(result.data['items']))  # 2
```

Works with nested structures too:

```python
class Order(BaseModel):
    order_id: str
    products: list[Product]

class Customer(BaseModel):
    name: str
    orders: list[Order]

# Drops unrepairable items at any nesting level
result = repair_keys(
    data, schema,
    drop_unrepairable_items=True
)
if result.success:
    use(result.data)
```

### Complex Nested Structures

```python
class Customer(BaseModel):
    customer_id: str
    name: str
    email: str

class Order(BaseModel):
    order_id: str
    customer: Customer
    products: list[Product]
    total: float

# Works with arbitrarily complex nesting!
json_str = '''
{
    "order_idd": "ORD-123",
    "custmer": {
        "customer_idd": "C-001",
        "nam": "John",
        "emal": "john@example.com"
    },
    "prodcts": [
        {"product_idd": "P-001", "nam": "Laptop", "pric": 1299.99}
    ],
    "totl": 1299.99
}
'''

order = fuzzy_model_validate_json(
    json_str,
    Order,
    max_total_error_ratio=2.0  # Allow higher error ratio for complex structures
)
```

## API Reference

### `repair_keys(data, json_schema, max_error_ratio_per_key=0.3, max_total_error_ratio=0.5, strict_validation=False, drop_unrepairable_items=False)`

Repair dictionary keys using fuzzy matching against a JSON schema.

**Parameters:**
- `data` (dict): Input dictionary with potential typos
- `json_schema` (dict): JSON schema from `model.model_json_schema()`
- `max_error_ratio_per_key` (float): Maximum error ratio per individual key (0.0-1.0). Default: 0.3
- `max_total_error_ratio` (float): Maximum average error ratio across all schema fields (0.0-1.0). Default: 0.5
- `strict_validation` (bool): If True, reject unrecognized keys. Default: False
- `drop_unrepairable_items` (bool): If True, drop list items that can't be repaired (respects minItems). Default: False

**Returns:**
- `RepairResult`: Object with:
  - `success` (bool): Whether repair succeeded
  - `data` (dict | None): Repaired data (None if failed)
  - `error_ratio` (float): Total error ratio
  - `errors` (list[RepairError]): List of errors encountered

**Example:**
```python
schema = User.model_json_schema()
result = repair_keys(data, schema)
if result.success:
    user = User.model_validate(result.data)
else:
    print(f"Repair failed: {len(result.errors)} errors")
```

### `fuzzy_model_validate_json(json_data, model_cls, repair_syntax=True, max_error_ratio_per_key=0.3, max_total_error_ratio=0.3, strict_validation=False, drop_unrepairable_items=False)`

Repair JSON string and return validated Pydantic model instance.

**Parameters:**
- `json_data` (str): JSON string to repair
- `model_cls` (type[BaseModel]): Pydantic model class
- `repair_syntax` (bool): Attempt to fix JSON syntax errors. Default: True (requires json-repair)
- `max_error_ratio_per_key` (float): Max error per individual key. Default: 0.3
- `max_total_error_ratio` (float): Max average error across all fields. Default: 0.3
- `strict_validation` (bool): Reject unrecognized keys. Default: False
- `drop_unrepairable_items` (bool): Drop list items that can't be repaired (respects minItems). Default: False

**Returns:**
- `BaseModel`: Validated Pydantic model instance

**Raises:**
- `ValueError`: If repair fails or validation fails

**Example:**
```python
user = fuzzy_model_validate_json(json_str, User)
```

## Error Types

```python
from fuzzy_json_repair import ErrorType, RepairError, RepairResult

# ErrorType enum:
ErrorType.misspelled_key       # Typo was fixed
ErrorType.unrecognized_key     # Unknown key (kept if not strict)
ErrorType.missing_expected_key  # Required field missing

# RepairError dataclass:
error = RepairError(
    error_type=ErrorType.misspelled_key,
    from_key='nam',
    to_key='name',
    error_ratio=0.143,
)
print(error)
# "Misspelled key 'nam' → 'name' (error: 14.3%)"

# RepairResult dataclass:
result = RepairResult(
    success=True,
    data={'name': 'John', 'age': 30},
    error_ratio=0.15,
    errors=[error]
)
print(f"Success: {result.success}")
print(f"Misspelled: {len(result.misspelled_keys)}")
print(f"Failed: {result.failed}")
```

## Configuration

### Error Ratio Thresholds

```python
# Strict (only very close matches)
repair_keys(data, schema, max_error_ratio_per_key=0.2)

# Moderate (default, good for most cases)
repair_keys(data, schema, max_error_ratio_per_key=0.3)

# Lenient (fix even poor matches)
repair_keys(data, schema, max_error_ratio_per_key=0.5)
```

### Strict Validation

```python
# Reject unrecognized keys
result = repair_keys(data, schema, strict_validation=True)
if result.success:
    use(result.data)
```

### Drop Unrepairable Items

```python
# Drop list items that exceed error thresholds
result = repair_keys(
    data, schema,
    drop_unrepairable_items=True
)

# Respects minItems constraints
from pydantic import Field

class Cart(BaseModel):
    items: list[Product] = Field(min_length=2)

# If dropping would violate minItems=2, repair fails
result = repair_keys(data, schema, drop_unrepairable_items=True)
if not result.success:
    print("Would violate minItems constraint")
```

## Performance

The library uses two matching strategies:

- **With numpy**: Uses `process.cdist()` for batch processing (10-20x faster)
- **Without numpy**: Uses `process.extractOne()` loop (still fast)

Both use `fuzz.ratio` from RapidFuzz - no raw Levenshtein distance anywhere.

**Benchmark (1000 repairs):**
- With numpy: ~0.05s
- Without numpy: ~0.5s

Install with `pip install fuzzy-json-repair[fast]` for best performance.

## How It Works

1. **Schema Extraction**: Extracts expected keys, nested schemas, and `$ref` definitions from Pydantic's JSON schema
2. **Exact Matching**: Processes keys that match exactly (fast path)
3. **Fuzzy Matching**: For typos, uses RapidFuzz's `fuzz.ratio` to find best match
4. **Batch Processing**: Computes all similarities at once with `cdist` (when numpy available)
5. **Recursive Repair**: Automatically handles nested objects and lists
6. **Validation**: Returns repaired data ready for Pydantic validation

## Use Cases

- **LLM Output Validation**: Fix typos in JSON generated by language models
- **API Integration**: Handle variations in third-party API responses
- **Data Migration**: Repair legacy data with inconsistent field names
- **User Input**: Correct typos in user-provided configuration files
- **Robust Parsing**: Build fault-tolerant JSON parsers

## Requirements

- Python 3.11+
- pydantic >= 2.0.0
- rapidfuzz >= 3.0.0

**Optional:**
- numpy >= 1.20.0 (for faster batch processing)
- json-repair >= 0.7.0 (for JSON syntax repair)

## Development

```bash
# Clone repository
git clone https://github.com/sayef/fuzzy-json-repair.git
cd fuzzy-json-repair

# Install with dev dependencies
pip install -e ".[dev,fast,syntax]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=fuzzy_json_repair --cov-report=term-missing

# Format code
black fuzzy_json_repair tests
isort fuzzy_json_repair tests

# Type check
mypy fuzzy_json_repair

# Lint
ruff check fuzzy_json_repair tests
```

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## Credits

- Uses [RapidFuzz](https://github.com/maxbachmann/RapidFuzz) for fast fuzzy matching
- Built for [Pydantic](https://github.com/pydantic/pydantic) integration
- Optional [json-repair](https://github.com/mangiucugna/json_repair) support

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "fuzzy-json-repair",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "json, repair, fuzzy, matching, typo, pydantic, validation, llm",
    "author": null,
    "author_email": "Sayef <hello@sayef.tech>",
    "download_url": "https://files.pythonhosted.org/packages/ca/f3/3f09ec219e32a6155ddd4e83d56b5d9c4c6e27f93affe4b575ca3f350b2b/fuzzy_json_repair-0.1.4.tar.gz",
    "platform": null,
    "description": "# Fuzzy JSON Repair\n\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nYou ask an LLM for JSON, it gives you `{\"nam\": \"John\", \"emal\": \"john@example.com\"}` instead of `{\"name\": \"John\", \"email\": \"john@example.com\"}`. Your Pydantic validation fails. You spend an hour writing error handling code.\n\nThis library fixes those typos automatically using fuzzy string matching. No more manual key mapping, no more try-except blocks everywhere.\n\n## Install\n\n```bash\npip install fuzzy-json-repair\n```\n\nIf you're processing lots of data, install with numpy for ~10x faster batch processing:\n\n```bash\npip install fuzzy-json-repair[fast]\n```\n\n## Usage\n\nThe simplest way - repair and validate in one go:\n\n```python\nfrom pydantic import BaseModel\nfrom fuzzy_json_repair import fuzzy_model_validate_json\n\nclass User(BaseModel):\n    name: str\n    age: int\n    email: str\n\n# Your LLM gave you this\njson_str = '{\"nam\": \"John\", \"agge\": 30, \"emal\": \"john@example.com\"}'\n\n# This just works\nuser = fuzzy_model_validate_json(json_str, User)\nprint(user)  # User(name='John', age=30, email='john@example.com')\n```\n\nOr if you want more control:\n\n```python\nfrom fuzzy_json_repair import repair_keys\n\nschema = User.model_json_schema()\ndata = {'nam': 'John', 'agge': 30, 'emal': 'john@example.com'}\n\nresult = repair_keys(data, schema)\n\nif result.success:\n    user = User.model_validate(result.data)\nelse:\n    print(f\"Repair failed: {len(result.errors)} errors\")\n    print(f\"Error ratio: {result.error_ratio:.2%}\")\n```\n\n## Advanced Usage\n\n### Nested Objects\n\n```python\nclass Address(BaseModel):\n    street: str\n    city: str\n    zip_code: str\n\nclass Person(BaseModel):\n    name: str\n    address: Address\n\ndata = {\n    'nam': 'John',\n    'addres': {\n        'stret': '123 Main St',\n        'cty': 'NYC',\n        'zip_cod': '10001'\n    }\n}\n\nschema = Person.model_json_schema()\nresult = repair_keys(data, schema, max_error_ratio_per_key=0.5)\n\n# All nested typos are fixed!\nif result.success:\n    person = Person.model_validate(result.data)\n```\n\n### Lists of Objects\n\n```python\nclass Product(BaseModel):\n    product_id: str\n    name: str\n    price: float\n\nclass Cart(BaseModel):\n    cart_id: str\n    products: list[Product]\n\ndata = {\n    'cart_idd': 'C123',\n    'prodcts': [\n        {'product_idd': 'P1', 'nam': 'Laptop', 'pric': 999.99},\n        {'product_idd': 'P2', 'nam': 'Mouse', 'pric': 29.99}\n    ]\n}\n\nschema = Cart.model_json_schema()\nresult = repair_keys(data, schema, max_error_ratio_per_key=0.5)\n\n# Repairs all typos in the list items too!\nif result.success:\n    cart = Cart.model_validate(result.data)\n```\n\n### Drop Unrepairable Items\n\nSometimes list items are beyond repair. Drop them automatically while respecting `minItems` constraints:\n\n```python\nclass Product(BaseModel):\n    name: str\n    price: float\n\nclass Cart(BaseModel):\n    items: list[Product]\n\ndata = {\n    'items': [\n        {'nam': 'Laptop', 'pric': 999},        # Repairable\n        {'completely': 'wrong', 'keys': 123},  # Beyond repair\n        {'nme': 'Mouse', 'prce': 29}           # Repairable\n    ]\n}\n\nschema = Cart.model_json_schema()\nresult = repair_keys(\n    data, schema,\n    drop_unrepairable_items=True  # Drop items that can't be fixed\n)\n\nif result.success:\n    # Returns 2 items (dropped the broken one)\n    print(len(result.data['items']))  # 2\n```\n\nWorks with nested structures too:\n\n```python\nclass Order(BaseModel):\n    order_id: str\n    products: list[Product]\n\nclass Customer(BaseModel):\n    name: str\n    orders: list[Order]\n\n# Drops unrepairable items at any nesting level\nresult = repair_keys(\n    data, schema,\n    drop_unrepairable_items=True\n)\nif result.success:\n    use(result.data)\n```\n\n### Complex Nested Structures\n\n```python\nclass Customer(BaseModel):\n    customer_id: str\n    name: str\n    email: str\n\nclass Order(BaseModel):\n    order_id: str\n    customer: Customer\n    products: list[Product]\n    total: float\n\n# Works with arbitrarily complex nesting!\njson_str = '''\n{\n    \"order_idd\": \"ORD-123\",\n    \"custmer\": {\n        \"customer_idd\": \"C-001\",\n        \"nam\": \"John\",\n        \"emal\": \"john@example.com\"\n    },\n    \"prodcts\": [\n        {\"product_idd\": \"P-001\", \"nam\": \"Laptop\", \"pric\": 1299.99}\n    ],\n    \"totl\": 1299.99\n}\n'''\n\norder = fuzzy_model_validate_json(\n    json_str,\n    Order,\n    max_total_error_ratio=2.0  # Allow higher error ratio for complex structures\n)\n```\n\n## API Reference\n\n### `repair_keys(data, json_schema, max_error_ratio_per_key=0.3, max_total_error_ratio=0.5, strict_validation=False, drop_unrepairable_items=False)`\n\nRepair dictionary keys using fuzzy matching against a JSON schema.\n\n**Parameters:**\n- `data` (dict): Input dictionary with potential typos\n- `json_schema` (dict): JSON schema from `model.model_json_schema()`\n- `max_error_ratio_per_key` (float): Maximum error ratio per individual key (0.0-1.0). Default: 0.3\n- `max_total_error_ratio` (float): Maximum average error ratio across all schema fields (0.0-1.0). Default: 0.5\n- `strict_validation` (bool): If True, reject unrecognized keys. Default: False\n- `drop_unrepairable_items` (bool): If True, drop list items that can't be repaired (respects minItems). Default: False\n\n**Returns:**\n- `RepairResult`: Object with:\n  - `success` (bool): Whether repair succeeded\n  - `data` (dict | None): Repaired data (None if failed)\n  - `error_ratio` (float): Total error ratio\n  - `errors` (list[RepairError]): List of errors encountered\n\n**Example:**\n```python\nschema = User.model_json_schema()\nresult = repair_keys(data, schema)\nif result.success:\n    user = User.model_validate(result.data)\nelse:\n    print(f\"Repair failed: {len(result.errors)} errors\")\n```\n\n### `fuzzy_model_validate_json(json_data, model_cls, repair_syntax=True, max_error_ratio_per_key=0.3, max_total_error_ratio=0.3, strict_validation=False, drop_unrepairable_items=False)`\n\nRepair JSON string and return validated Pydantic model instance.\n\n**Parameters:**\n- `json_data` (str): JSON string to repair\n- `model_cls` (type[BaseModel]): Pydantic model class\n- `repair_syntax` (bool): Attempt to fix JSON syntax errors. Default: True (requires json-repair)\n- `max_error_ratio_per_key` (float): Max error per individual key. Default: 0.3\n- `max_total_error_ratio` (float): Max average error across all fields. Default: 0.3\n- `strict_validation` (bool): Reject unrecognized keys. Default: False\n- `drop_unrepairable_items` (bool): Drop list items that can't be repaired (respects minItems). Default: False\n\n**Returns:**\n- `BaseModel`: Validated Pydantic model instance\n\n**Raises:**\n- `ValueError`: If repair fails or validation fails\n\n**Example:**\n```python\nuser = fuzzy_model_validate_json(json_str, User)\n```\n\n## Error Types\n\n```python\nfrom fuzzy_json_repair import ErrorType, RepairError, RepairResult\n\n# ErrorType enum:\nErrorType.misspelled_key       # Typo was fixed\nErrorType.unrecognized_key     # Unknown key (kept if not strict)\nErrorType.missing_expected_key  # Required field missing\n\n# RepairError dataclass:\nerror = RepairError(\n    error_type=ErrorType.misspelled_key,\n    from_key='nam',\n    to_key='name',\n    error_ratio=0.143,\n)\nprint(error)\n# \"Misspelled key 'nam' \u2192 'name' (error: 14.3%)\"\n\n# RepairResult dataclass:\nresult = RepairResult(\n    success=True,\n    data={'name': 'John', 'age': 30},\n    error_ratio=0.15,\n    errors=[error]\n)\nprint(f\"Success: {result.success}\")\nprint(f\"Misspelled: {len(result.misspelled_keys)}\")\nprint(f\"Failed: {result.failed}\")\n```\n\n## Configuration\n\n### Error Ratio Thresholds\n\n```python\n# Strict (only very close matches)\nrepair_keys(data, schema, max_error_ratio_per_key=0.2)\n\n# Moderate (default, good for most cases)\nrepair_keys(data, schema, max_error_ratio_per_key=0.3)\n\n# Lenient (fix even poor matches)\nrepair_keys(data, schema, max_error_ratio_per_key=0.5)\n```\n\n### Strict Validation\n\n```python\n# Reject unrecognized keys\nresult = repair_keys(data, schema, strict_validation=True)\nif result.success:\n    use(result.data)\n```\n\n### Drop Unrepairable Items\n\n```python\n# Drop list items that exceed error thresholds\nresult = repair_keys(\n    data, schema,\n    drop_unrepairable_items=True\n)\n\n# Respects minItems constraints\nfrom pydantic import Field\n\nclass Cart(BaseModel):\n    items: list[Product] = Field(min_length=2)\n\n# If dropping would violate minItems=2, repair fails\nresult = repair_keys(data, schema, drop_unrepairable_items=True)\nif not result.success:\n    print(\"Would violate minItems constraint\")\n```\n\n## Performance\n\nThe library uses two matching strategies:\n\n- **With numpy**: Uses `process.cdist()` for batch processing (10-20x faster)\n- **Without numpy**: Uses `process.extractOne()` loop (still fast)\n\nBoth use `fuzz.ratio` from RapidFuzz - no raw Levenshtein distance anywhere.\n\n**Benchmark (1000 repairs):**\n- With numpy: ~0.05s\n- Without numpy: ~0.5s\n\nInstall with `pip install fuzzy-json-repair[fast]` for best performance.\n\n## How It Works\n\n1. **Schema Extraction**: Extracts expected keys, nested schemas, and `$ref` definitions from Pydantic's JSON schema\n2. **Exact Matching**: Processes keys that match exactly (fast path)\n3. **Fuzzy Matching**: For typos, uses RapidFuzz's `fuzz.ratio` to find best match\n4. **Batch Processing**: Computes all similarities at once with `cdist` (when numpy available)\n5. **Recursive Repair**: Automatically handles nested objects and lists\n6. **Validation**: Returns repaired data ready for Pydantic validation\n\n## Use Cases\n\n- **LLM Output Validation**: Fix typos in JSON generated by language models\n- **API Integration**: Handle variations in third-party API responses\n- **Data Migration**: Repair legacy data with inconsistent field names\n- **User Input**: Correct typos in user-provided configuration files\n- **Robust Parsing**: Build fault-tolerant JSON parsers\n\n## Requirements\n\n- Python 3.11+\n- pydantic >= 2.0.0\n- rapidfuzz >= 3.0.0\n\n**Optional:**\n- numpy >= 1.20.0 (for faster batch processing)\n- json-repair >= 0.7.0 (for JSON syntax repair)\n\n## Development\n\n```bash\n# Clone repository\ngit clone https://github.com/sayef/fuzzy-json-repair.git\ncd fuzzy-json-repair\n\n# Install with dev dependencies\npip install -e \".[dev,fast,syntax]\"\n\n# Run tests\npytest\n\n# Run tests with coverage\npytest --cov=fuzzy_json_repair --cov-report=term-missing\n\n# Format code\nblack fuzzy_json_repair tests\nisort fuzzy_json_repair tests\n\n# Type check\nmypy fuzzy_json_repair\n\n# Lint\nruff check fuzzy_json_repair tests\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Credits\n\n- Uses [RapidFuzz](https://github.com/maxbachmann/RapidFuzz) for fast fuzzy matching\n- Built for [Pydantic](https://github.com/pydantic/pydantic) integration\n- Optional [json-repair](https://github.com/mangiucugna/json_repair) support\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Fix typos in JSON keys using fuzzy matching with RapidFuzz",
    "version": "0.1.4",
    "project_urls": {
        "Documentation": "https://github.com/sayef/fuzzy-json-repair#readme",
        "Homepage": "https://github.com/sayef/fuzzy-json-repair",
        "Issues": "https://github.com/sayef/fuzzy-json-repair/issues",
        "Repository": "https://github.com/sayef/fuzzy-json-repair"
    },
    "split_keywords": [
        "json",
        " repair",
        " fuzzy",
        " matching",
        " typo",
        " pydantic",
        " validation",
        " llm"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2492b6a243f96d1bab505480cf7fe99ce6c6df8eac03bd069be76de4145e0878",
                "md5": "89e6ecdde90b4b1070086581fd0ab315",
                "sha256": "bfb91ce1e2eb2a930fe967c73e3c29edb8f2c626b002d0a9440876a9ffae9a98"
            },
            "downloads": -1,
            "filename": "fuzzy_json_repair-0.1.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "89e6ecdde90b4b1070086581fd0ab315",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 12535,
            "upload_time": "2025-10-26T11:16:15",
            "upload_time_iso_8601": "2025-10-26T11:16:15.845511Z",
            "url": "https://files.pythonhosted.org/packages/24/92/b6a243f96d1bab505480cf7fe99ce6c6df8eac03bd069be76de4145e0878/fuzzy_json_repair-0.1.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "caf33f09ec219e32a6155ddd4e83d56b5d9c4c6e27f93affe4b575ca3f350b2b",
                "md5": "71e4d4bc6ca808a06656dddd6f5566f5",
                "sha256": "530ed6ac95a9b651a8d0623c1216288bab7be32a9354a55509f3e9639ecd76b3"
            },
            "downloads": -1,
            "filename": "fuzzy_json_repair-0.1.4.tar.gz",
            "has_sig": false,
            "md5_digest": "71e4d4bc6ca808a06656dddd6f5566f5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 17746,
            "upload_time": "2025-10-26T11:16:17",
            "upload_time_iso_8601": "2025-10-26T11:16:17.198765Z",
            "url": "https://files.pythonhosted.org/packages/ca/f3/3f09ec219e32a6155ddd4e83d56b5d9c4c6e27f93affe4b575ca3f350b2b/fuzzy_json_repair-0.1.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-26 11:16:17",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "sayef",
    "github_project": "fuzzy-json-repair#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "fuzzy-json-repair"
}
        
Elapsed time: 1.40628s