Skip to content

vexy_json v2.0.0 Release Notes

๐Ÿš€ Major Release - January 2025

We're thrilled to announce vexy_json v2.0.0, a groundbreaking release that transforms vexy_json from a capable JSON parser into a high-performance, enterprise-ready parsing platform. This release introduces streaming APIs, parallel processing, a plugin architecture, and significant performance improvements.

๐ŸŒŸ Highlights

  • Streaming Parser: Process gigabyte-sized JSON files with minimal memory usage
  • Parallel Processing: Multi-threaded parsing with intelligent chunk boundaries
  • Plugin Architecture: Extensible framework for custom transformations and validators
  • SIMD Optimization: 2-3x performance improvements for string scanning
  • Memory Pool V3: 80% reduction in allocations with typed arenas
  • Enhanced CLI: Watch mode, batch processing, and advanced formatting
  • NDJSON Support: Native support for newline-delimited JSON streams
  • Error Recovery V2: ML-based pattern recognition with actionable suggestions

vexy_json v1.0.0 Release Notes

๐Ÿš€ Stable Release - January 7, 2025

We're excited to announce the stable release of vexy_json v1.0.0, a production-ready forgiving JSON parser for Rust. This is a complete port of the JavaScript library the reference implementation, bringing powerful and flexible JSON parsing capabilities to the Rust ecosystem.

๐ŸŽ‰ What is vexy_json?

vexy_json is a forgiving JSON parser that extends standard JSON with developer-friendly features while maintaining full compatibility with RFC 8259. It allows you to parse relaxed JSON syntax commonly found in configuration files, making JSON more human-readable and maintainable.

โœจ Key Features

๐Ÿ”ง Forgiving JSON Parsing (10/10 Features Complete)

  • Comments: Single-line (//, #) and multi-line (/* */) comments
  • Flexible Strings: Both single (') and double (") quoted strings
  • Unquoted Keys: Object keys without quotes ({key: value})
  • Trailing Commas: Allow trailing commas in arrays and objects
  • Implicit Structures: Top-level objects and arrays without brackets
  • Flexible Numbers: Leading/trailing dots, explicit + signs
  • Advanced Parsing: Consecutive commas, leading commas, mixed syntax

๐Ÿš€ Production-Ready Quality

  • 100% Test Coverage: All 73 tests passing across 8 test suites
  • Zero Warnings: Clean compilation with zero compiler/clippy warnings
  • Performance Optimized: Sub-millisecond parsing for typical use cases
  • Memory Efficient: Zero-copy parsing where possible
  • Error Recovery: Detailed error messages with position information

๐Ÿ”— Comprehensive Integration

  • Serde Support: Full serialization/deserialization integration
  • CLI Tool: Command-line JSON processor for shell workflows
  • Dual APIs: High-level convenience and low-level control
  • Rust Idiomatic: Leverages Result types, pattern matching, and traits

๐Ÿ“ฆ Installation

Library Usage

Add to your Cargo.toml:

[dependencies]
vexy_json = "1.0.0"

CLI Tool

cargo install vexy_json

๐ŸŽฏ Usage Examples

Basic Library Usage

use vexy_json::parse;

// Standard JSON
let data = parse(r#"{"name": "Alice", "age": 30}"#)?;

// Forgiving JSON with comments and unquoted keys
let config = parse(r#"{
    // Application configuration
    server_port: 8080,
    database: {
        host: 'localhost',
        timeout: 30,  // trailing comma OK
    }
}"#)?;

// Implicit top-level structures
let object = parse("name: 'Alice', age: 30")?;
// โ†’ {"name": "Alice", "age": 30}

let array = parse("'red', 'green', 'blue'")?;
// โ†’ ["red", "green", "blue"]

CLI Tool Usage

# Process configuration files
echo "{debug: true, port: 3000}" | vexy_json
# Output: {"debug":true,"port":3000}

# Handle files with comments
cat config.jsonc | vexy_json > config.json

# Pipeline integration
curl api.example.com/config | vexy_json | jq '.database'

Serde Integration

use vexy_json::from_str;
use serde::Deserialize;

#[derive(Deserialize)]
struct Config {
    host: String,
    port: u16,
}

let config: Config = from_str("host: 'localhost', port: 8080")?;

๐Ÿ“Š Performance Characteristics

Based on comprehensive benchmark testing:

  • Core JSON Parsing: 11.5ยตs - 4.7ms (simple objects to 1000-element arrays)
  • Forgiving Features: 6.7ยตs - 23.6ยตs overhead (20-40% vs strict mode)
  • Real-world Scenarios: 81.5ยตs - 357.5ยตs for complex nested structures
  • Linear Scaling: O(n) performance characteristics validated
  • Production Suitable: Sub-millisecond performance for typical use cases

๐Ÿงช Test Coverage & Quality Metrics

Complete Test Suite Results (73/73 Passing):

  • โœ… Unit tests: 2/2 passing
  • โœ… Basic tests: 7/7 passing
  • โœ… Forgiving features: 10/10 passing
  • โœ… Jsonic compatibility: 17/17 passing
  • โœ… Newline-as-comma: 8/8 passing
  • โœ… Number formats: 8/8 passing
  • โœ… Supported the reference implementation: 17/17 passing
  • โœ… Doc tests: 4/4 passing

Quality Standards:

  • Zero compiler warnings
  • Zero clippy warnings
  • Clean build with exit code 0
  • Comprehensive error handling
  • Full rustdoc documentation

๐Ÿ”„ the reference implementation Compatibility

vexy_json achieves complete compatibility with the the reference implementation JavaScript library:

  • All 17 the reference implementation compatibility tests pass
  • Identical parsing behavior for all supported features
  • Same error handling and edge case behavior
  • Seamless migration path from the reference implementation.js projects

๐Ÿ› ๏ธ Configuration Options

Customize parsing behavior with ParserOptions:

use vexy_json::{parse_with_options, ParserOptions};

let mut options = ParserOptions::default();
options.allow_comments = false;           // Disable comments
options.allow_trailing_commas = false;    // Strict comma handling
options.allow_unquoted_keys = false;      // Require quoted keys

let result = parse_with_options(input, options)?;

๐Ÿ—๏ธ Architecture

vexy_json is built with a clean, modular architecture:

  • Lexer: High-performance tokenization with zero-copy strings
  • Parser: Recursive descent parser with configurable grammar
  • Value System: Rich JSON value representation with conversions
  • Error Handling: Detailed error messages with position tracking
  • Options System: Granular control over parsing features

๐Ÿ”ฎ What's Next?

This v1.0.0 release represents a stable, production-ready parser. Future development will focus on:

  • Performance optimizations
  • Additional forgiving features based on community feedback
  • Enhanced error recovery mechanisms
  • Extended ecosystem integration

๐Ÿค Contributing

We welcome contributions! See our contributing guidelines for details on:

  • Code style and standards
  • Testing requirements
  • Documentation expectations
  • Community guidelines

๐Ÿ“„ License

Licensed under either of:

at your option.

๐Ÿ™ Acknowledgments

Special thanks to the the reference implementation.js project for the original implementation and design patterns that made this Rust port possible.



๐Ÿš€ Version 2.0.0 - Major Release

๐ŸŽฏ New Features

Streaming Parser API

Process large JSON files incrementally without loading them entirely into memory:

use vexy_json::{StreamingParser, StreamingEvent};

let mut parser = StreamingParser::new();
parser.feed(chunk1)?;
parser.feed(chunk2)?;
parser.finish()?;

while let Some(event) = parser.next_event()? {
    match event {
        StreamingEvent::ObjectKey(key) => println!("Key: {}", key),
        StreamingEvent::String(s) => println!("Value: {}", s),
        _ => {}
    }
}

Parallel Processing

Automatically process large files using multiple CPU cores:

use vexy_json::parse_parallel;

let json_files = vec![file1, file2, file3, file4];
let results = parse_parallel(json_files);

Plugin System

Extend vexy_json with custom functionality:

use vexy_json::{Plugin, parse_with_plugins};

struct MyPlugin;
impl Plugin for MyPlugin {
    fn name(&self) -> &str { "my-plugin" }
    fn transform(&self, value: &mut Value) -> Result<(), Error> {
        // Custom transformation logic
        Ok(())
    }
}

let plugins = vec![Box::new(MyPlugin)];
let value = parse_with_plugins(input, options, &plugins)?;

NDJSON Support

Native support for newline-delimited JSON:

use vexy_json::NdJsonParser;

let mut parser = NdJsonParser::new();
let values = parser.feed(ndjson_content)?;

โšก Performance Improvements

  • SIMD String Scanning: 2-3x faster string processing using vectorized operations
  • Memory Pool V3: 80% reduction in allocations with typed arena allocators
  • Parallel Chunking: Intelligent boundary detection for safe parallel parsing
  • String Interning: Reduced memory usage for repeated JSON keys
  • Zero-Copy Paths: Optimized paths for simple values avoid allocations
  • FxHashMap: Faster hash map implementation for object parsing

๐Ÿ› ๏ธ CLI Enhancements

Watch Mode

vexy_json --watch config.json --output formatted.json

Batch Processing

vexy_json --batch ./data/ --output-dir ./processed/ --parallel

Advanced Formatting

vexy_json input.json --pretty --sort-keys --indent 4

๐Ÿ”ง API Improvements

  • Async Support: Future-ready async traits for streaming operations
  • Better Error Context: Enhanced error messages with recovery suggestions
  • Type-Safe Builders: Fluent API for constructing parser configurations
  • Visitor Pattern: AST manipulation with the visitor pattern
  • Event-Driven API: Fine-grained control over parsing events

๐Ÿ“Š Benchmarks

Operation v1.0.0 v2.0.0 Improvement
1MB JSON Parse 8.5ms 3.2ms 2.7x faster
100MB JSON Stream 850ms 180ms 4.7x faster
Memory Usage (1MB) 3.2MB 1.1MB 65% less
Parallel 10x1MB 85ms 12ms 7.1x faster

๐Ÿ› Bug Fixes

  • Fixed memory leak in deeply nested object parsing
  • Resolved panic on malformed Unicode escapes
  • Corrected trailing comma handling in strict mode
  • Fixed thread safety issues in parallel parsing
  • Resolved WASM binding memory alignment issues

๐Ÿ’” Breaking Changes

While we've maintained backward compatibility for most APIs, some changes were necessary:

  1. Error Types: Error enum variants have been reorganized for better categorization
  2. Feature Flags: Some feature flags have been renamed for consistency
  3. WASM API: JavaScript API now uses camelCase consistently

๐Ÿ“ฆ Dependency Updates

  • Updated to wasm-bindgen 0.2.90
  • Updated to rayon 1.8.0 for parallel processing
  • Added simd-json for SIMD operations
  • Added crossbeam-channel for streaming

๐Ÿ” Known Issues

  • Streaming parser doesn't yet support custom number parsing
  • Plugin API is still experimental and may change
  • Some SIMD optimizations require nightly Rust

๐Ÿ™ Acknowledgments

Special thanks to all contributors who made this release possible, especially: - The Rust community for invaluable feedback - the reference implementation.js maintainers for the original inspiration - Our beta testers who helped identify edge cases


Ready to upgrade?

cargo add vexy_json@2.0.0

For migration guidance, see our Migration Guide.

Questions or feedback? Open an issue on GitHub.

Happy parsing! ๐Ÿฆ€