ai-json-fixer
Version:
A simple JSON parser designed to handle malformed JSON from Large Language Models
165 lines (118 loc) • 3.55 kB
Markdown
# ai-json-fixer
A simple JSON parser specifically designed to handle malformed JSON output from Large Language Models (LLMs) like GPT, Claude, and others.
## Features
### Core
- **Markdown Block Extraction**: Extracts JSON from ```json code blocks and inline `code`
- **Trailing Content Removal**: Removes explanatory text after valid JSON structures
- **Quote Fixing**: Fixes unescaped quotes inside JSON strings
- **Missing Comma Detection**: Adds missing commas between array elements and object properties
- Single-line JSON support for compact LLM outputs like `{"a": 1 "b": 2}` and `[1 2 3]`
- Multi-line JSON support for formatted outputs
### Key Benefits
- **Zero Dependencies**: Pure TypeScript/JavaScript implementation
- **Comprehensive Testing**: 86+ tests covering real LLM output patterns
- **TypeScript Support**: Full type definitions included
- **Configurable**: Multiple parsing modes and options
- **Error Recovery**: Graceful handling of malformed input
## Installation
```bash
npm install ai-json-fixer
```
## Quick Start
```typescript
import { LLMJSONParser } from 'ai-json-fixer';
const parser = new LLMJSONParser();
// Parse JSON from LLM output with markdown
const llmOutput = `Here's the data you requested:
\`\`\`json
{
"users": [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
],
"total": 2
}
\`\`\`
This JSON contains the user information.`;
const result = parser.parse(llmOutput);
console.log(result);
// Output: { users: [...], total: 2 }
```
## Common Use Cases
### Extract from Markdown
```typescript
const input = `\`\`\`json\n{"key": "value"}\n\`\`\``;
const result = parser.parse(input); // { key: "value" }
```
### Fix Quote Issues
```typescript
const input = '{"message": "He said "hello" to me"}';
const result = parser.parse(input); // { message: 'He said "hello" to me' }
```
### Remove Trailing Content
```typescript
const input = '{"status": "ok"} The request was successful.';
const result = parser.parse(input); // { status: "ok" }
```
### Handle Missing Commas
**Multi-line JSON:**
```typescript
const input = `{
"name": "John"
"age": 30
}`;
const result = parser.parse(input); // { name: "John", age: 30 }
```
**Single-line JSON:**
```typescript
// Objects
const input1 = '{"a": 1 "b": 2 "c": 3}';
const result1 = parser.parse(input1); // { a: 1, b: 2, c: 3 }
// Arrays
const input2 = '[1 2 3 4 5]';
const result2 = parser.parse(input2); // [1, 2, 3, 4, 5]
// Complex structures
const input3 = '[{"id": 1} {"id": 2}]';
const result3 = parser.parse(input3); // [{ id: 1 }, { id: 2 }]
```
## API Reference
### `LLMJSONParser`
#### `parse<T>(input: string, options?: ParseOptions): T | null`
Parse JSON input with automatic fixing. Returns parsed object or null if parsing fails.
#### `tryParse<T>(input: string, options?: ParseOptions): ParseResult<T>`
Parse with detailed results including applied fixes and confidence score.
### Options
```typescript
interface ParseOptions {
mode?: 'strict' | 'standard' | 'aggressive';
stripMarkdown?: boolean;
trimTrailing?: boolean;
fixQuotes?: boolean;
addMissingCommas?: boolean;
trackFixes?: boolean;
throwOnError?: boolean;
maxFixAttempts?: number;
}
```
### Parse Result
```typescript
interface ParseResult<T> {
data: T | null;
fixes?: Fix[];
confidence?: number;
warnings?: string[];
}
```
## Development
```bash
# Install dependencies
npm install
# Run tests
npm test
# Build
npm run build
# Run examples
npx tsx examples/basic-usage.ts
```
## License
MIT