31

How can I parse the JSON string

{"data":{"results":[{"Branch":"ACCT590003"}]}}

using the TJSONObject object? I want to get the ACCT590003 value from this string.

Sebastian Zartner
  • 18,808
  • 10
  • 90
  • 132
Salvador
  • 16,132
  • 33
  • 143
  • 245

5 Answers5

38

You don't need to use external libraries to perform a JSONPath search. Example with Delphi 10 Seattle:

uses  System.JSON;
procedure ParseJSonValue;
var
   JSonValue:TJSonValue;
   st:string;
   Branch: string;
begin
   st := '{"data":{"results":[{"Branch":"ACCT590003"}]}}';
   JsonValue := TJSonObject.ParseJSONValue(st);
   Branch := JsonValue.GetValue<string>('data.results[0].Branch');
   JsonValue.Free;
end;
jaruzafa
  • 676
  • 6
  • 8
21
uses
  SysUtils,
  DBXJSON;

type
  TProcessJSONString = TProc<TJSONString>;

procedure DoJSONObject(o: TJSONObject; Process: TProcessJSONString); forward;

procedure DoJSONArray(o: TJSONArray; Process: TProcessJSONString);
var i: integer;
    v: TJSONValue;
begin
  for i := 0 to o.Size - 1 do begin
    v := o.Get(i);
    if v is TJSONObject then
      DoJSONObject(v as TJSONObject, Process);
  end;
end;

procedure DoJSONObject(o: TJSONObject; Process: TProcessJSONString);
var i: integer;
    p: TJSONPair;
begin
  for i := 0 to o.Size - 1 do begin
    p := o.Get(i);
    Process(p.JsonString);
    if p.JsonValue is TJSONObject then
      DoJSONObject(p.JsonValue as TJSONObject, Process)
    else if p.JsonValue is TJSONArray then
      DoJSONArray(p.JsonValue as TJSONArray, Process)
    else if p.JsonValue is TJSONString then
      Process(p.JsonValue as TJSONString);
  end;
end;

var o: TJSONObject;
begin
  o := TJSONObject.ParseJSONValue('{"data":{"results":[{"Branch":"ACCT590003"}]}}') as TJSONObject;
  try
    DoJSONObject(o,
      procedure (o: TJSONString)
      begin
        WriteLn(o.ToString);
      end
    );
  finally
    o.Free;
  end;
  ReadLn;
end.
Chau Chee Yang
  • 18,422
  • 16
  • 68
  • 132
10

Try this code, it works fine

uses System.JSON;

procedure _Parse_JSonValue;
var
   JSonObject:TJSonObject;
   JSonValue:TJSonValue;
   st:string;
   Branch: string;
Begin
   st := '{"data":{"results":[{"Branch":"ACCT590003"}]}}';
   JSonObject := TJSonObject.Create;
   JsonValue:=JSonObject.ParseJSONValue(st);
   JsonValue:=(JsonValue as TJSONObject).Get('data').JSONValue;
   JsonValue:=(JsonValue as TJSONObject).Get('results').JSONValue;
   if (JSONValue is TJSONArray) then
      Branch := ((JSONValue as TJSONArray).Items[0] as TJSonObject).Get('Branch').JSONValue.Value;
   JSonObject.Free;
End;

Branch = 'ACCT590003'

Simoh
  • 101
  • 1
  • 2
5

using TALdocument it's easy

AJsonDoc := TalJsonDocument.create;
AjsonDoc.loadFromJsonString('{"data":{"results":[{"Branch":"ACCT590003"}]}}');
writeln(AjsonDoc.childnode['data']['result'][0]['Branch'].text);
zeus
  • 12,173
  • 9
  • 63
  • 184
5

Using SuperObject Library https://github.com/hgourvest/superobject/

var json: iSuperObject;
    data: string;

begin
  json := SO('{"data":{"results":[{"Branch":"ACCT590003"}]}}'); // shorthand
// or equal:  JSON := TSuperObject.ParseString('{"data":{"results":[{"Branch":"ACCT590003"}]}}');

  data := json.S['data.results[0].Branch'];

  WriteLn('Result is: ', data);
end.
Arioch 'The
  • 15,799
  • 35
  • 62