Genson Core
Fast and robust Rust library for JSON schema inference: pre-validates JSON to avoid panics, handles errors properly.
Adapts the genson-rs library's SIMD parallelism after first checking the string with serde_json
in a streaming pass without allocating values.
This is the core library that powers both the genson-cli command-line tool and the polars-genson Python plugin. It includes a vendored and enhanced version of the genson-rs library with added safety features and comprehensive error handling.
Features
- Robust JSON Schema Inference: Generate JSON schemas from JSON data with comprehensive type detection
- Normalisation Against Schema: Enforce a consistent Avro schema across heterogeneous JSON inputs (handles empty arrays/maps, unions, type coercion, etc.)
- Parallel Processing: Efficient processing of large JSON datasets using Rayon
- Enhanced Error Handling: Proper error propagation instead of panics for invalid JSON
- Multiple Input Formats: Support for regular JSON, NDJSON, and arrays of JSON objects
- Field Order Preservation: Maintains original field ordering using IndexMap
- Memory Efficient: Uses mimalloc for optimized memory allocation
- SIMD Acceleration: Fast JSON parsing with simd-json
Quick Start
Add this to your Cargo.toml:
[]
= "0.1.2"
- ⚠️ Caution: if you include
serde_jsonin your dependencies but don't activate itspreserve_orderfeature,genson-coreschema properties will not be in insertion order. This may be an unwelcome surprise!
= { = "1.0", = ["preserve_order"] }
Basic Usage
use ;
Configuration Options
use ;
let config = SchemaInferenceConfig ;
let result = infer_json_schema?;
NDJSON Processing
let ndjson_data = vec!;
let config = SchemaInferenceConfig ;
let result = infer_json_schema?;
Advanced Schema Building
For more control over the schema building process:
use ;
let mut builder = get_builder;
let build_config = BuildConfig ;
let mut json_bytes = br#"{"field": "value"}"#.to_vec;
let schema = build_json_schema;
let final_schema = builder.to_schema;
Perfect — the genson-core README should stay crate-focused, and just document the new normalisation feature. Here’s a section you can drop in after Schema Features but before Integration:
Normalisation
In addition to inferring schemas, genson-core can normalise arbitrary JSON values against an Avro schema.
This is useful when working with jagged or heterogeneous data where rows may encode the same field in different ways.
What it does
- Ensures every row conforms to the same inferred schema.
- Converts empty arrays/maps to
nullby default (configurable). - Normalises scalars into arrays when the schema requires it.
- Handles optional fields, missing values, and type mismatches gracefully.
- Supports unions: the first non-null type branch takes precedence.
- Optional coercion of strings to numbers/booleans (
"42"→42,"true"→true).
API
use ;
use json;
let schema = json!;
let cfg = default;
let input = json!;
let normalised = normalise_value;
assert_eq!;
Configuration
NormaliseConfig lets you control behaviour:
let cfg = NormaliseConfig ;
Example
Input values:
Normalised (default):
Normalised (with coerce_string = true):
Performance Features
Parallel Processing
The library automatically uses parallel processing for:
- Large JSON arrays (when items > 10)
- NDJSON files with delimiter-based splitting
- Multiple JSON objects in a single input
Memory Optimisation
- mimalloc: Fast memory allocation
- SIMD JSON: Hardware-accelerated parsing where available
- Streaming: Processes large files without loading everything into memory
Error Handling
The library has been put together so as to avoid panics. That said, if a panic does occur, it will
be caught. This was left in after solving the initial panic problem, and should not be seen in
practice, since the JSON is always pre-validated with serde_json and panics only occurred when the
JSON was invalid. Please report any examples you find that panic along with the JSON that caused it
if possible.
The library provides comprehensive error handling that catches and converts internal panics into proper error messages:
let invalid_json = vec!;
match infer_json_schema
Error messages include:
- Position information for syntax errors
- Truncated JSON content for context (prevents huge error messages)
- Clear descriptions of what went wrong
Schema Features
Type Inference
The library accurately infers:
- Basic types:
string,number,integer,boolean,null - Complex types:
object,array - Nested structures with proper schema merging
- Optional vs required fields based on data presence
Field Order Preservation
This library uses OrderMap to preserve the original field ordering from JSON input:
// Input: {"z": 1, "b": 2, "a": 3}
// Output schema will maintain z -> b -> a ordering
Schema Merging
When processing multiple JSON objects, schemas are intelligently merged:
// Object 1: {"name": "Alice", "age": 30}
// Object 2: {"name": "Bob", "city": "NYC"}
// Merged schema: name (required), age (optional), city (optional)
Integration
This crate is designed as the foundation for:
- polars-genson: Python plugin for Polars DataFrames
- genson-cli: Command-line JSON schema inference tool (mainly for testing)
Safety & Reliability
- Panic Safety: All genson-rs panics are caught and converted to errors
- Memory Safety: Comprehensive bounds checking and safe parsing
- Input Validation: JSON validation before processing
- Graceful Degradation: Handles malformed input gracefully
Contributing
This crate is part of the polars-genson project. See the main repository for the contribution and development docs.
License
Licensed under the MIT License. See LICENSE](https://github.com/lmmx/polars-genson/blob/master/LICENSE) for details.
Contains vendored and adapted code from the Apache 2.0 licensed genson-rs crate.