如何在Delphi中解析JSON字符串?

时间:2010-12-03 23:32:28

标签: delphi json delphi-xe

如何解析JSON字符串

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

使用TJSONObject对象?我想从此字符串中获取ACCT590003值。

6 个答案:

答案 0 :(得分:13)

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.

答案 1 :(得分:5)

您不需要使用外部库来执行JSONPath搜索。 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;

答案 2 :(得分:2)

使用TALdocument很容易

AJsonDoc := TalJsonDocument.create;
AjsonDoc.loadFromJsonString('{"data":{"results":[{"Branch":"ACCT590003"}]}}');
writeln(AjsonDoc.childnode['data']['result'][0]['Branch'].text);

答案 3 :(得分:2)

使用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.

答案 4 :(得分:2)

试试这段代码,它运作正常

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'

答案 5 :(得分:-1)

用 Delphi 了解 Json 的最佳视频 Learn How to Use the New JSON Features in RAD Studio 10 Seattle

这里是我的样本。

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
   W : TStringWriter;
   JW : TJsonTextWriter;
  I: Integer;
begin
   W :=TStringWriter.Create;
   JW := TJsonTextWriter.Create(W);
   With JW Do
      Begin
         Formatting:=TJsonFormatting.Indented;
         WriteStartObject;
         WritePropertyName('CheckListBox1');
         WriteStartArray;
         for I := 0 to CheckListBox1.Items.Count-1  do
             Begin
               WriteStartObject;
               WritePropertyName(CheckListBox1.Items[I]);
               WriteValue(CheckListBox1.Checked[I]);
               WriteEndObject;
             End;
          WriteEndArray;
          WriteEndObject;
      End;
    Memo1.Clear;
    Memo1.Lines.Text:=W.ToString

end;

不要忘记使用这个单位

System.JSON.Writers,System.JSON.readers,System.JSON,System.JSON.Types

用于阅读清单框

procedure TForm1.BitBtn3Click(Sender: TObject);
Var
   W : TStringReader;
   JW : TJsonTextReader;
  I: Integer;
begin
   W :=TStringReader.Create(Memo1.Lines.Text);
   JW := TJsonTextReader.Create(W);
   I:=0;
   while JW.Read do
       Begin
          if (JW.Depth = 3) Then
             Begin
                CheckListBox2.Items.Add(JW.Value.ToString);
                JW.Read;
                CheckListBox2.Checked[I]:=JW.Value.AsBoolean;
                Inc(I);
             End;
       End;

end;