Ваш вопрос и комментарии противоречивы. В вашем вопросе говорится, что вы используете 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;