mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-12 07:38:16 +02:00
332 lines
8.3 KiB
ObjectPascal
332 lines
8.3 KiB
ObjectPascal
{
|
|
This file is part of the Free Component Library
|
|
|
|
JSON Data structures demo
|
|
Copyright (c) 2007 by Michael Van Canneyt michael@freepascal.org
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
program simpledemo;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
Classes, SysUtils, fpjson;
|
|
|
|
Procedure DumpJSONData(J : TJSonData; DOEOLN : Boolean = True);
|
|
|
|
Var
|
|
I : Integer;
|
|
|
|
begin
|
|
// JSONType property determines kind of value.
|
|
Case J.jsontype of
|
|
jtNull : Write('Null');
|
|
jtBoolean : If J.AsBoolean then
|
|
Write('True')
|
|
else
|
|
Write('False');
|
|
jtNumber : {JSONNumber has extra NumberType property
|
|
which determines kind of value (int/float).}
|
|
Case TJSONNumber(J).NumberType of
|
|
ntInteger : Write(J.AsInteger);
|
|
ntFloat : Write(J.AsFloat:10:2);
|
|
end;
|
|
jtString : Write('"',J.AsString,'"');
|
|
jtArray : begin
|
|
Write('[ ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
DumpJSONData(J.Items[I],False);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Write(' ]');
|
|
end;
|
|
jtObject : begin
|
|
Write('{ ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Writeln('"',TJSONObject(J).Names[i],'" : ');
|
|
DumpJSONData(J.Items[I],False);
|
|
If I<J.Count-1 then
|
|
Write(',')
|
|
end;
|
|
Write('}');
|
|
end;
|
|
end;
|
|
If DOEOLN then
|
|
Writeln;
|
|
end;
|
|
|
|
|
|
Procedure EndTest(Msg : String;J : TJSOnData);
|
|
|
|
begin
|
|
Write(Msg, ' : ');
|
|
DumpJSONData(J);
|
|
FreeAndNil(J);
|
|
end;
|
|
|
|
Procedure DoTestCreate;
|
|
|
|
|
|
begin
|
|
Writeln('Constructor tests');
|
|
EndTest('Null value',TJSOnNull.Create);
|
|
EndTest('Boolean true',TJSONBoolean.Create(True));
|
|
EndTest('Boolean false',TJSONBoolean.Create(False));
|
|
EndTest('Integer value',TJSONIntegerNumber.Create(100));
|
|
EndTest('Float value',TJSONFloatNumber.Create(1.2e3));
|
|
EndTest('String value',TJSONString.Create('Some weird JSON string'));
|
|
EndTest('Empty Array value',TJSONArray.Create);
|
|
EndTest('Array value from array of const',TJSONArray.Create([1,'a',2,'b']));
|
|
EndTest('Empty Object value',TJSONObject.Create);
|
|
// Name, Value, name, value
|
|
EndTest('Object from array of const',TJSONObject.Create(['a',1,'b',True,'C',Nil]));
|
|
|
|
end;
|
|
|
|
Procedure DoTestAs;
|
|
|
|
Var
|
|
J : TJsonData;
|
|
|
|
begin
|
|
Writeln('AsNNN value accessing tests, number with value 123:');
|
|
J:=TJSonIntegerNumber.Create(123);
|
|
Writeln('IsNull : ',J.IsNull);
|
|
Writeln('AsInteger : ',J.AsInteger);
|
|
Writeln('AsBoolean : ',J.AsBoolean);
|
|
Writeln('AsString : ',J.AsString);
|
|
Writeln('AsFloat : ',J.AsFloat:5:3);
|
|
FreeAndNil(J);
|
|
Writeln('Test IsNull');
|
|
J:=TJSonNull.Create;
|
|
Writeln('Test for null with IsNull');
|
|
Writeln('IsNull : ',J.ISNull);
|
|
Writeln('Test number of children :');
|
|
Writeln('Count (0) : ',J.Count);
|
|
FreeAndNil(J);
|
|
J:=TJSONArray.Create(['a','b','c']);
|
|
Writeln('Count (3): ',J.Count);
|
|
FreeAndNil(J);
|
|
J:=TJSONObject.Create(['a',1,'b',2]);
|
|
Writeln('Count (2): ',J.Count);
|
|
FreeAndNil(J);
|
|
end;
|
|
|
|
Procedure DoTestArray;
|
|
|
|
Var
|
|
J : TJSOnArray;
|
|
I : Integer;
|
|
|
|
begin
|
|
Writeln('JSON array with elements 0,1,2,3');
|
|
J:=TJSONArray.Create([0,1,2,3]);
|
|
Write('Access through Elements[] (default) array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J[I].AsString);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Nulls[] array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J.Nulls[I]);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Booleans[] array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J.Booleans[I]);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Integers[] array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J.Integers[I]);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Floats[] array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J.Floats[I]:5:2);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Strings[] array property : ');
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
Write(J.Strings[I]);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create with 3 empty TJSONObjects in array constructor');
|
|
Write('Access through Objects[] array property : ');
|
|
J:=TJSONArray.Create([TJSOnObject.Create,TJSOnObject.Create,TJSOnObject.Create]);
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
DumpJSONData(J.Objects[I],False);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create with 3 empty TJSONArrays in array constructor');
|
|
Write('Access through Arrays[] array property : ');
|
|
J:=TJSONArray.Create([TJSOnArray.Create,TJSOnArray.Create,TJSOnArray.Create]);
|
|
For I:=0 to J.Count-1 do
|
|
begin
|
|
DumpJSONData(J.Arrays[I],False);
|
|
If I<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create empty array. Add elements with overloaded Add() method');
|
|
J:=TJSONArray.Create;
|
|
J.Add; // Null
|
|
J.Add(True);
|
|
J.Add(False);
|
|
J.Add(123);
|
|
J.Add(2.34);
|
|
J.Add('A string');
|
|
J.Add(TJSOnArray.Create);
|
|
J.Add(TJSOnObject.Create);
|
|
DumpJSONData(J);
|
|
FreeAndNil(J);
|
|
end;
|
|
|
|
Procedure DoTestObject;
|
|
|
|
Var
|
|
J : TJSONObject;
|
|
I : Char;
|
|
k : Integer;
|
|
|
|
begin
|
|
Writeln('JSON object with elements a=0,b=1,c=2,d=3');
|
|
J:=TJSONObject.Create(['a',0,'b',1,'c',2,'d',3]);
|
|
Write('Get element names with Names[] array property : ');
|
|
For K:=1 to J.Count-1 do
|
|
begin
|
|
Write(J.Names[k]);
|
|
If K<J.Count-1 then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Elements[] (default) array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J[I].AsString);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Nulls[] array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J.Nulls[I]);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Booleans[] array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J.Booleans[I]);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Integers[] array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J.Integers[I]);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Floats[] array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J.Floats[I]:5:2);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
Write('Access through Strings[] array property : ');
|
|
For I:='a' to 'd' do
|
|
begin
|
|
Write(i,' : ',J.Strings[I]);
|
|
If I<'d' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create with 3 empty TJSONObjects in array constructor');
|
|
Write('Access through Objects[] array property : ');
|
|
J:=TJSONObject.Create(['a',TJSOnObject.Create,'b',TJSOnObject.Create,'c',TJSOnObject.Create]);
|
|
For I:='a' to 'c' do
|
|
begin
|
|
Write(i,' : ');
|
|
DumpJSONData(J.Objects[i],False);
|
|
If I<'c' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create with 3 empty TJSONArrays in array constructor');
|
|
Write('Access through Arrays[] array property : ');
|
|
J:=TJSONObject.Create(['a',TJSONArray.Create,'b',TJSONArray.Create,'c',TJSONArray.Create]);
|
|
For I:='a' to 'c' do
|
|
begin
|
|
Write(i,' : ');
|
|
DumpJSONData(J.Arrays[I],False);
|
|
If I<'c' then
|
|
Write(', ');
|
|
end;
|
|
Writeln;
|
|
FreeAndNil(J);
|
|
Writeln('Create empty object. Add elements with overloaded Add() method');
|
|
J:=TJSONObject.Create;
|
|
J.Add('a'); // Null
|
|
J.Add('b',True);
|
|
J.Add('c',False);
|
|
J.Add('d',123);
|
|
J.Add('e',2.34);
|
|
J.Add('f','A string');
|
|
J.Add('g',TJSONArray.Create);
|
|
J.Add('h',TJSOnObject.Create);
|
|
DumpJSONData(J);
|
|
FreeAndNil(J);
|
|
end;
|
|
|
|
|
|
begin
|
|
DoTestCreate;
|
|
DoTestAs;
|
|
DoTestArray;
|
|
DoTestObject;
|
|
end.
|
|
|