[Up][Next] Reference for unit 'JsonReader' (#fcl)

Using JSON readers with streams and files

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:


Documentation generated on: Jan 27 2026