Ошибка использования jsonobject.count и пар

Я хочу обработать строку json, следуя примеру:

{"colors":[{"name":"red","hex":"#f00"},{"name":"blue","hex":"#xxx"}]}

Я пробовал разные варианты и получал следующие ошибки:

var o: TJSONObject; a: TJSONArray; книга: TJSONObject; idx: integer; idy: integer; begin o: = TJSONObject.ParseJSONValue (TEncoding.ASCII.GetBytes (Memo1.Lines.Text), 0) как TJSONObject; попробуйте: = TJSONArray (o.Get («цвета»). JsonValue); для idx: = 0 до pred (a.size) do begin book: = TJSONObject (a.Get (idx)); для idy: = 0 до pred (book.Count) do begin ShowMessage (book.Pairs [idy] .JsonString.ToString + ':' + book.Pairs [idy] .JsonValue.ToString); конец; конец; наконец o.Free; конец; конец; не содержит член с именем «System.JSON» в строке ...
Data.DBXJson не содержит члена с именем «TJSONObject» в строке ...
Undeclared identifier JsonString ...

Я использую приложение DBXJson
Delphi 10.2.3, vcl

Код:

Count

NEW IN JSON, для обучения, но я не могу понять

json,delphi,

0

Ответов: 2


2 принят

Ваш вопрос и комментарии противоречивы. В вашем вопросе говорится, что вы используете Delphi 10.2.3, но ваши комментарии говорят, что вы используете XE5.

В Delphi 10.2.3 используйте Pairsустройство. В XE5 используйте TJSONObject.Sizeустройство.

Если вы читаете документацию для версии XE5 TJSONObject, она не имеет Countи Pairsсвойств, следовательно, ошибки, которые вы видите в своем внутреннем цикле. Вместо этого вы должны использовать TJSONObject.Sizeсвойство и var o: TJSONObject; a: TJSONArray; book: TJSONObject; p: TJSONPair; idx: integer; idy: integer; begin o := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Lines.Text),0) as TJSONObject; try a := o.Get('colors').JsonValue as TJSONArray; for idx := 0 to pred(a.Size) do begin book := a.Get(idx).JsonValue as TJSONObject; for idy := 0 to pred(book.Size) do begin p := book.Get(idy); ShowMessage(p.JsonString.ToString + ':' + p.JsonValue.ToString); end; end; finally o.Free; end; end; метод, например, ваш внешний цикл уже используется, например:

TJSONArray

В качестве альтернативы, TJSONObjectи TJSONObjectв XE5, и в 10.2.3 есть Enumeratorподдержка, поэтому вы можете использовать for..inциклы вместо этого, например:

var
  o: TJSONObject;
  a: TJSONArray;
  book: TJSONObject;
  v: TJSONValue;
  p: TJSONPair;
begin
  o := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Lines.Text),0) as TJSONObject;
  try
    a := o.Get('colors').JsonValue as TJSONArray;
    for v in a do
    begin
      book := v as TJSONObject;
      for p in book do
      begin
        ShowMessage(p.JsonString.ToString + ':' + p.JsonValue.ToString);
      end;
    end;
  finally
    o.Free;
  end;
end;

0

Если вы изучаете использование json в delphi, я бы посоветовал вам не использовать system.json, слишком сложный и очень медленный. взгляните на TalJsonDocument на странице https://github.com/Zeus64/alcinoe

MyJsonDoc.loadFromJson('{"colors":[{"name":"red","hex":"#f00"},{"name":"blue","hex":"#xxx"}]}');
for i := 0 to MyJsonDoc.childnodes['colors'].ChildNodes.count - 1 do begin
  writeln(MyJsonDoc.childnodes['colors'].childnodes[i].childnodes['name'].text);
  writeln(MyJsonDoc.childnodes['colors'].childnodes[i].childnodes['hex'].text);
end;
JSON, Дельфы,
Похожие вопросы