| [Up][Next] |
Both TJSONEventReader and TJSONConsumerReader can read JSON data from various sources including streams, files, and strings.
This flexibility allows you to process JSON data from files, network streams, or any other stream-based source without loading the entire content into memory first.
Here's an example that reads JSON from a file stream:
program JSONStreamDemo; {$mode objfpc}{$H+} uses Classes, SysUtils, jsonreader; type TJSONCounter = class private FObjectCount: Integer; FArrayCount: Integer; FStringCount: Integer; FNumberCount: Integer; public procedure OnStartObject(Sender: Object procedure OnStartArray(Sender: Objecte procedure OnStringValue(Sender: Objectt AValue: UTF8String); procedure OnIntegerValue(Sender: Objectt AValue: Integer); procedure OnFloatValue(Sender: Objectt AValue: Double); property ObjectCount: Integer read FObjectCount; property ArrayCount: Integer read FArrayCount; property StringCount: Integer read FStringCount; property NumberCount: Integer read FNumberCount; end; procedure TJSONCounter.OnStartObject(Sender: Object begin Inc(FObjectCount); end; procedure TJSONCounter.OnStartArray(Sender: Object begin Inc(FArrayCount); end; procedure TJSONCounter.OnStringValue(Sender: Objectt AValue: UTF8String); begin Inc(FStringCount); end; procedure TJSONCounter.OnIntegerValue(Sender: Objectt AValue: Integer); begin Inc(FNumberCount); end; procedure TJSONCounter.OnFloatValue(Sender: Objectt AValue: Double); begin Inc(FNumberCount); end; var FileStream: TFileStream; Reader: TJSONEventReader; Counter: TJSONCounter; JSONData: string; TempFile: TextFile; begin // Create a sample JSON file JSONData := '{"users": [{"name": "John", "age": 25}, {"name": "Jane", "age": 30}], "total": 2}'; AssignFile(TempFile, '/tmp/claude/sample.json'); Rewrite(TempFile); try Write(TempFile, JSONData); finally CloseFile(TempFile); end; Counter := TJSONCounter.Create; FileStream := TFileStream.Create('/tmp/claude/sample.json', fmOpenRead); Reader := TJSONEventReader.Create(FileStream, []); try // Assign counting event handlers Reader.OnStartObject := @Counter.OnStartObject; Reader.OnStartArray := @Counter.OnStartArray; Reader.OnStringValue := @Counter.OnStringValue; Reader.OnIntegerValue := @Counter.OnIntegerValue; Reader.OnFloatValue := @Counter.OnFloatValue; // Parse the JSON file Reader.Execute; // Display statistics Writeln('JSON Statistics:'); Writeln(' Objects: ', Counter.ObjectCount); Writeln(' Arrays: ', Counter.ArrayCount); Writeln(' Strings: ', Counter.StringCount); Writeln(' Numbers: ', Counter.NumberCount); finally Reader.Free; FileStream.Free; Counter.Free; // Clean up temp file DeleteFile('/tmp/claude/sample.json'); end; end.
You can also use the readers with string sources when the JSON data is already in memory:
// String source Reader := TJSONEventReader.Create(JSONString, []); // Unicode string source Reader := TJSONEventReader.Create(UnicodeJSONString, []); // Stream source with options Reader := TJSONEventReader.Create(MyStream, [joUTF8, joStrict]);
The parsing options (TJSONOptions) allow you to control: