Popular uma ComboBox com retorno de uma API REST sem usar Substring.

22/12/2022

0

Olá pessoal, ao consumir uma API Rest, obtenho o seguinte retorno:

["LARANJA","BANANA","MELANCIA","ABACATE'''']

Que estou armazenando em uma variável do tipo String chamada:
retornoString

Estou populando uma ComboBox da seguinte forma:
    retornoString := retornoString.Substring(1,length(retornoString)-2);
    retornoVetor := SplitString(retornoString, '''','''');
    for i := 0 to length(retornoVetor)-1 do
      cboCategorias.Items.Add(retornoVetor[i].Substring(1,length(retornoVetor[i])-2));

Observem que estou tendo que fazer um malabarismo para eliminar o colchete inicial e final, para em seguida criar um vetor com as frutas eliminando também cada uma das aspas, tudo com Substring, para só depois popular a ComboBox. Acho deselegante e trabalhoso ficar tirando caracteres com substring. Acredito que exista uma forma de converter a String de retorno diretamente em um objeto do tipo TStringList ou um outro objeto qualquer em forma de Array, para passar os itens desse objeto direto para a combo box, item a item através de laço ou o objeto todo de uma vez, de forma que o texto entre as aspas já sejam interpretados como string no momento de criar esse objeto. É possível? Alguém pode me dar um exemplo, por favor?
Rodolfo Andrade

Rodolfo Andrade

Responder

Post mais votado

23/12/2022

Veja uma maneira de se fazer usando TStringList:

var
  lista: TStringList;
  retornoString: string;
begin
  lista := TStringList.Create;
  try
    retornoString := '["LARANJA","BANANA","MELANCIA","ABACATE"]';

    //removemos os colchetes
    retornoString:= StringReplace(retornoString, '[', '', [rfReplaceAll]);
    retornoString:= StringReplace(retornoString, ']', '', [rfReplaceAll]);

    lista.DelimitedText := retornoString;
    lista.Delimiter := ',';

    ComboBox1.Items.AddStrings(lista);
  finally
    lista.Free;
  end;
end;

Natanael Ferreira

Natanael Ferreira
Responder

Mais Posts

23/12/2022

Claudio Andrade

Olá pessoal, ao consumir uma API Rest, obtenho o seguinte retorno:

["LARANJA","BANANA","MELANCIA","ABACATE'''']

Que estou armazenando em uma variável do tipo String chamada:
retornoString

Estou populando uma ComboBox da seguinte forma:
    retornoString := retornoString.Substring(1,length(retornoString)-2);
    retornoVetor := SplitString(retornoString, '''','''');
    for i := 0 to length(retornoVetor)-1 do
      cboCategorias.Items.Add(retornoVetor[i].Substring(1,length(retornoVetor[i])-2));

Observem que estou tendo que fazer um malabarismo para eliminar o colchete inicial e final, para em seguida criar um vetor com as frutas eliminando também cada uma das aspas, tudo com Substring, para só depois popular a ComboBox. Acho deselegante e trabalhoso ficar tirando caracteres com substring. Acredito que exista uma forma de converter a String de retorno diretamente em um objeto do tipo TStringList ou um outro objeto qualquer em forma de Array, para passar os itens desse objeto direto para a combo box, item a item através de laço ou o objeto todo de uma vez, de forma que o texto entre as aspas já sejam interpretados como string no momento de criar esse objeto. É possível? Alguém pode me dar um exemplo, por favor?



Se o retorno da api for um json, acho que essa documentação da Embarcadero deva lhe ajudar.
Basicamente ela pega o json e joga em um clientdataset.

https://blogs.embarcadero.com/robust-dataset-to-json-and-json-to-dataset-api-for-delphi/

Boa sorte!
Responder

23/12/2022

Rodolfo Andrade

Veja uma maneira de se fazer usando TStringList:

var
  lista: TStringList;
  retornoString: string;
begin
  lista := TStringList.Create;
  try
    retornoString := '["LARANJA","BANANA","MELANCIA","ABACATE"]';

    //removemos os colchetes
    retornoString:= StringReplace(retornoString, '[', '', [rfReplaceAll]);
    retornoString:= StringReplace(retornoString, ']', '', [rfReplaceAll]);

    lista.DelimitedText := retornoString;
    lista.Delimiter := ',';

    ComboBox1.Items.AddStrings(lista);
  finally
    lista.Free;
  end;
end;


Prazado Natanael, era bem isso que eu procurava, muito obrigado. Implementei aqui e funcionou. Agora vemos que ficou mais elegante o código com menos manipulação de strings, mais simples também pois as aspas já foram interpretadas como texto e não há mais a necessidade de um laço onde enviamos diretamente um objeto lista para a comboBox. Jóia! Melhor que isso agora só que existisse uma classe/método que interpretasse os cochetes e seus elementos já como um vetor de strings populando diretamente a lista. Aí seria fantástico! Muito obrigado também ao Cláudio Andrade pela contribuição.
Responder

28/12/2022

Emerson Nascimento

tente assim:
var
  jasonvalue: TJSONValue;
  jsonstring, item: string;
  elemento: integer;
begin
  jsonstring := '["LARANJA","BANANA","MELANCIA","ABACATE"]';
  jasonvalue := TJSONObject.ParseJSONValue(jsonstring);
  elemento:=0;

  jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item);
  repeat
    ShowMessage(item);
    inc(elemento);
  until not jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item);

end;
para funcionar será preciso acrescentar System.JSON à clausula uses.
Responder

28/12/2022

Emerson Nascimento

tente assim:
var
  jasonvalue: TJSONValue;
  jsonstring, item: string;
  elemento: integer;
begin
  jsonstring := '["LARANJA","BANANA","MELANCIA","ABACATE"]';
  jasonvalue := TJSONObject.ParseJSONValue(jsonstring);
  elemento:=0;

  repeat
    if jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item) then
      ShowMessage(item);
    inc(elemento);
  until not jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item);

end;
para funcionar será preciso acrescentar System.JSON à clausula uses.
Responder

28/12/2022

Rodolfo Andrade

tente assim:
var
  jasonvalue: TJSONValue;
  jsonstring, item: string;
  elemento: integer;
begin
  jsonstring := '["LARANJA","BANANA","MELANCIA","ABACATE"]';
  jasonvalue := TJSONObject.ParseJSONValue(jsonstring);
  elemento:=0;

  jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item);
  repeat
    ShowMessage(item);
    inc(elemento);
  until not jasonvalue.TryGetValue<string>('['+inttostr(elemento)+']',item);

end;
para funcionar será preciso acrescentar System.JSON à clausula uses.


Prezado Emerson, muito obrigado pela colaboração. Interessante essa solução que é justamente também algo que eu buscava, ou seja, transformar a string diretamente em um objeto JSON. Show!
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar