Popular uma ComboBox com retorno de uma API REST sem usar Substring.
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:
Estou populando uma ComboBox da seguinte forma:
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?
["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
Curtidas 0
Melhor post
Natanael Ferreira
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;
GOSTEI 1
Mais Respostas
Claudio Andrade
22/12/2022
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:
Estou populando uma ComboBox da seguinte forma:
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?
["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!
GOSTEI 0
Rodolfo Andrade
22/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;
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.
GOSTEI 0
Emerson Nascimento
22/12/2022
tente assim:
para funcionar será preciso acrescentar System.JSON à clausula uses.
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;
GOSTEI 1
Emerson Nascimento
22/12/2022
tente assim:
para funcionar será preciso acrescentar System.JSON à clausula uses.
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;
GOSTEI 0
Rodolfo Andrade
22/12/2022
tente assim:
para funcionar será preciso acrescentar System.JSON à clausula uses.
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;
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!
GOSTEI 1