NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3060 most downloaded on pub.dev
A streaming JSON parser optimized for LLM responses. Parse JSON reactively as it streams in, with path-based subscriptions and type-safe property access.
Last release 4 months ago
21 May 2026
Ships unpredictably
gaps range from 9 days to 5 months
Nearly every release is documented
notes for 20 of 20 stable releases
Nothing withdrawn
no release was ever pulled
10 months old
20 releases · first in 2025
One column per month.
Root Convenience Getters: Added .asMap, .stream, .future, and .asList() directly to JsonStreamParser for much simpler root-level interactions. `dart f
.asMap, .stream, .future, and .asList() directly to JsonStreamParser for much simpler root-level interactions.final parser = JsonStreamParser(stream);
// Easy root object operations:
parser.stream.listen((mapSnapshot) => print(mapSnapshot));
final completeMap = await parser.future;
StringPropertyStream, MapPropertyStream, and ListPropertyStream replayable streams in ReplayableBroadcastStream caching wrappers. This provides perfect reference identity stability for Flutter's StreamBuilder and animations during widget rebuilds, while perfectly preserving multiple subscriptions and late-subscriber buffer replay.Removed unused variables in JsonStreamParser
Added thinking tag skipper functionality to JsonStreamParser
skipThoughts parameter to ignore <thinking>...</thinking> tags in the input streamthinkingTags parameterfinal parser = JsonStreamParser(
stream,
skipThoughts: true, // Enable thinking tag skipping
thinkingTags: ('<reasoning>', '</reasoning>') // Custom tags
);
Renamed repository URLs in README and docs to use `llm-json-stream-dart`
llm-json-stream-dartMinor edits to README and API docs
Fixed broken docs: Removed dartdoc categories that caused broken topic links on pub.dev
Enhanced API documentation: Improved documentation comments for all public classes
StringBuffer optimization: Replaced String concatenation with StringBuffer in delegates and controllers for better memory efficiency
runtimeType.toString() comparisons with is type checks for faster delegate detection_valueFirstCharacters from List to Set in ListPropertyDelegateBuffered streams for Maps and Lists: Both MapPropertyStream and ListPropertyStream now support buffered (replayable) streams, matching StringPropertyS
Buffered streams for Maps and Lists: Both MapPropertyStream and ListPropertyStream now support buffered (replayable) streams, matching StringPropertyStream behavior
.stream (default, recommended): Replays the latest value to new subscribers (BehaviorSubject-style), preventing race conditions when subscribing late.unbufferedStream: Direct access to the live stream without replay, for cases where you need live-only behavioronProperty callback for Maps: Similar to onElement for lists, maps now support an onProperty callback that fires when each property starts parsing
parser.getMapProperty('user').onProperty((property, key) {
print('Property "$key" started parsing');
// Subscribe to property value as it streams
});
Yap Filter (closeOnRootComplete): New parser option to stop parsing after the root JSON object/array completes, ignoring any trailing text from the LLM
final parser = JsonStreamParser(stream, closeOnRootComplete: true);
// Stops after root JSON, ignores: "Hope this helps!"
Observability with ParseEvent: Monitor parsing events in real-time with the onLog callback
final parser = JsonStreamParser(stream, onLog: (event) {
print('[${event.type}] ${event.message}');
});
rootStart, mapKeyDiscovered, listElementStart, propertyStart, propertyComplete, stringChunk, yapFiltered.onLog() method on any PropertyStreamMapPropertyStream.stream now returns a replayable stream that emits the latest state to new subscribersListPropertyStream.stream now returns a replayable stream that emits the latest state to new subscribersdispose() was called before async completers finished, causing "Parser was disposed before property completed" errorsIf you were relying on the previous behavior where .stream didn't replay values:
// Before (0.3.x): .stream was unbuffered
mapStream.stream.listen(...);
// After (0.4.0): Use .unbufferedStream for the same behavior
mapStream.unbufferedStream.listen(...);
// Or use .stream (recommended) for buffered/replayable behavior
mapStream.stream.listen(...); // Will receive latest state immediately
Updated README import statements to use llm_json_stream package name
llm_json_stream package nameFixed return types for getter methods
src/ folder for better package structureRemoved JsonStreamParserController as an export
JsonStreamParserController as an exportPropertyStream objects:
asString()asNum()asBool()asMap()asList()Added streams for lists and maps
Updated README with new demos showcasing functionality
Fixed getMapProperty() returning empty maps instead of populated content
getMapProperty() returning empty maps instead of populated contentitems[0]) not containing their full contentUpdated demo to use Github raw content URL
Fixed demo not showing in Pub.dev
- Changelog fixes - Added main example
- Minor documentation updates
Initial release of streaming JSON parser optimized for LLM responses
Your coding agent can read these notes before it upgrades. Set up the MCP server →