Как разобрать строку JSON в Delphi?

Как я могу разобрать строку JSON

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

с помощью объекта TJSONObject? Я хочу получить значение ACCT590003 из этой строки.


person Salvador    schedule 03.12.2010    source источник


Ответы (6)


Вам не нужно использовать внешние библиотеки для выполнения поиска JSONPath. Пример с Delphi 10 Сиэтл:

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;
person jaruzafa    schedule 02.07.2018
comment
Первоначальный вопрос был о создании экземпляра TJSonObject, а не о получении TJsonValue.. ^^ - person Christopher Stock; 02.04.2020

Попробуйте этот код, он отлично работает

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;

Филиал = 'ACCT590003'

person Simoh    schedule 19.02.2017

с помощью TALdocument легко

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

Использование библиотеки SuperObject 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.
person Arioch 'The    schedule 27.04.2016

Лучшее видео о знакомстве с Json в Delphi Узнайте, как использовать новые функции JSON в 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;
person M.Vakili    schedule 23.06.2021
comment
Вы точно читали вопрос? Вы должны удалить свой ответ, чтобы не потерять репутацию. - person fpiette; 23.06.2021
comment
Почему? Я ищу ответ, искал и вижу этот вопрос. ни один из ответов на этом сайте не помог мне ... поэтому я попытался сохранить этот ответ для следующих посетителей. и репутация для меня не важна - person M.Vakili; 23.06.2021
comment
Вопрос здесь (см. вверху страницы) касается извлечения данных из строки в формате JSON. Ваш ответ не делает этого вообще. Ваш ответ касается создания строки в формате JSON, а не наоборот. Вы никому не поможете плохим ответом. Если вы сами что-то искали и не нашли, то открывайте новый вопрос. - person fpiette; 23.06.2021
comment
Танки за ваше время и ваши комментарии - person M.Vakili; 23.06.2021

person    schedule
comment
Хотя это хорошо, обычно предпочтительнее использовать доступные системные библиотеки, чтобы упростить обслуживание кода. - person T.S; 21.08.2019
comment
Это именно то, что мне нужно. Спас мой день! - person Paulo França Lacerda; 17.10.2019