Bundle Streaming JSON parser for processing large documents without loading the full tree into memory. Reads tokens sequentially via a cursor-based API. Compile with -lib json.
StreamParser
Event driven stream JSON parser
stream := FileReader->New(filename);
if(stream->IsOpen()) {
parser := StreamParser->New(stream);
found := false;
do {
if(parser->FindElement("Value", 4)) {
parser->Next();
if(parser->GetTypeValue()->Equals("{d4db6850-5385-11d0-89e9-00a0c90a90ac}")) {
found := true;
};
};
}
while(<>found & parser->Next());
parser->GetTypeValue()->PrintLine();
};
stream->Close();Operations
AtLevel #
Checks the current parse level
method : public : AtLevel(level:Int) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| level | Int | parse level |
Return
| Type | Description |
|---|---|
| Bool | current parse level |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) {
if(parser->AtLevel(1)) { # only process tokens at depth 1
parser->GetTypeValue()->PrintLine();
};
};
stream->Close();FindElement #
Find element by name
method : public : FindElement(name:String) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| name | String | element by name |
Return
| Type | Description |
|---|---|
| Bool | true if found, false otherwise |
Example
stream := FileReader->New("config.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
if(parser->FindElement("version")) { # seek to "version" label
parser->Next();
parser->GetTypeValue()->PrintLine(); # print the value
};
stream->Close();FindElement #
Find element by name
method : public : FindElement(name:String, level:Int) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| name | String | element by name |
| level | Int | element level |
Return
| Type | Description |
|---|---|
| Bool | true if found, false otherwise |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
# find "id" only at nesting depth 2
if(parser->FindElement("id", 2)) {
parser->Next();
parser->GetTypeValue()->PrintLine();
};
stream->Close();FindElement #
Find element by type
method : public : FindElement(type:StreamParser->Type) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| type | StreamParser->Type | element by type |
Return
| Type | Description |
|---|---|
| Bool | true if found, false otherwise |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
# advance to the first array token
if(parser->FindElement(Data.JSON.Stream.StreamParser->Type->ARRAY)) {
parser->GetTypeValue()->PrintLine(); # prints "["
};
stream->Close();FindElement #
Find element by type
method : public : FindElement(type:StreamParser->Type, level:Int) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| type | StreamParser->Type | element by type |
| level | Int | element level |
Return
| Type | Description |
|---|---|
| Bool | true if found, false otherwise |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
# find a number token at depth 1
if(parser->FindElement(Data.JSON.Stream.StreamParser->Type->NUMBER, 1)) {
parser->GetTypeValue()->PrintLine();
};
stream->Close();GetLevel #
Get JSON parse level. Level increase as objects and arrays are parsed.
method : public : GetLevel() ~ IntReturn
| Type | Description |
|---|---|
| Int | JSON parse level |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) {
level := parser->GetLevel(); # depth: 0=top, 1=first object, etc.
"{$level}: {$parser->GetTypeValue()}"->PrintLine();
};
stream->Close();GetType #
Get JSON type
method : public : GetType() ~ StreamParser->TypeReturn
| Type | Description |
|---|---|
| StreamParser->Type | JSON type |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) {
type := parser->GetType(); # get enum type of current token
parser->GetTypeName()->PrintLine();
};
stream->Close();GetTypeName #
Get JSON type name
method : public : GetTypeName() ~ StringReturn
| Type | Description |
|---|---|
| String | JSON type name |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) {
parser->GetTypeName()->PrintLine(); # e.g. "label", "string", "number"
};
stream->Close();GetTypeValue #
Get JSON values
method : public : GetTypeValue() ~ StringReturn
| Type | Description |
|---|---|
| String | JSON value if it exists, blank string otherwise |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) {
value := parser->GetTypeValue(); # get string form of token
value->PrintLine();
};
stream->Close();HasError #
Checks if a parsing error occurred
method : public : HasError() ~ BoolReturn
| Type | Description |
|---|---|
| Bool | true if error, false otherwise |
Example
stream := FileReader->New("broken.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) { };
if(parser->HasError()) { # true if malformed JSON was encountered
"Parse failed"->ErrorLine();
};
stream->Close();New # constructor
Constructor
New(input:InputStream)Parameters
| Name | Type | Description |
|---|---|---|
| input | InputStream | input stream |
Example
stream := FileReader->New("data.json");
if(stream->IsOpen()) {
parser := Data.JSON.Stream.StreamParser->New(stream);
parser->Next();
stream->Close();
};Next #
Checks for the next JSON token
method : public : Next() ~ BoolReturn
| Type | Description |
|---|---|
| Bool | true if next token exists, false otherwise |
Example
stream := FileReader->New("data.json");
parser := Data.JSON.Stream.StreamParser->New(stream);
while(parser->Next()) { # iterate all tokens
parser->GetTypeName()->Print();
" => "->Print();
parser->GetTypeValue()->PrintLine();
};
stream->Close();