You can skip straight to the code, if you want to. The leading text is explanation, but not necessary.
I am trying to use SuperObject to parse Delphi.
I was just using the plain JSON classes that come with Delphi 10.4, but had difficulty with some slightly complex functionality.
E.g stuff, such as does a.b.c
exist, or a.b.c.d
- where d
is an array - or a.b.c.d[3]
.
And how to iterate over a.b.c.d
. And to assign a value to a.b.c.d.e
, updating it if it exists, creating it if not; and, if only part of the path exists, create it all e.g only a.b
exists and I want to assign a value to a.b.c.d[3].e
.
If anyone can point me to some examples of that sort of thing, I would be grateful.
Now, to my question. It seemed from various posts that SuperObject would be the answer, but I am failing at my first basic step - to test the existence of a nested JSN element.
Here's my code (is there an online JSON Fiddle site?)
unit fMainForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses System.IOUtils,
SuperObject;
procedure TForm1.FormCreate(Sender: TObject);
var json: ISuperObject;
jsonString : String;
begin
// Example JSON taken from https://stackoverflow.com/questions/10539797/complex-json-nesting-of-objects-and-arrays
jsonString := '{' +
'"problems": [{' +
' "Diabetes":[{' +
' "medications":[{' +
' "medicationsClasses":[{' +
' "className":[{' +
' "associatedDrug":[{' +
' "name":"asprin",' +
' "dose":"",' +
' "strength":"500 mg"' +
' }],' +
' "associatedDrug#2":[{' +
' "name":"somethingElse",' +
' "dose":"",' +
' "strength":"500 mg"' +
' }]' +
' }],' +
' "className2":[{' +
' "associatedDrug":[{' +
' "name":"asprin",' +
' "dose":"",' +
' "strength":"500 mg"' +
' }],' +
' "associatedDrug#2":[{' +
' "name":"somethingElse",' +
' "dose":"",' +
' "strength":"500 mg"' +
' }]' +
' }]' +
' }]' +
' }],' +
' "labs":[{' +
' "missing_field": "missing_value"' +
' }]' +
' }],' +
' "Asthma":[{}]' +
'}]}';
json := SO(jsonString);
if json.AsObject.Exists('problems') then
Memo1.Lines.Add('"problems" found')
else
Memo1.Lines.Add('"problems" not found');
if json.AsObject.Exists('problems.Diabetes') then
Memo1.Lines.Add('"problems.Diabetes" found')
else
Memo1.Lines.Add('"problems.Diabetes" not found');
end;
end.
When I run it, the memo contains
"problems" found
"problems.Diabetes" not found
How do I test for the existence of problems.Diabetes
?
If I can crack that, I will try to update the strength
of an associatedDrug
, then insert a new key/value pair into the associatedDrug
, then extend an existing key by adding several depths.